51Nod 1241 特殊的排序 —— 思維、DP
阿新 • • 發佈:2018-04-11
too 算法題 空間限制 技術 retext .html tcs 進行 ron
Output
題目鏈接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1241
1241 特殊的排序 題目來源: 摩根斯坦利的比賽題 基準時間限制:1 秒 空間限制:131072 KB 分值: 80 難度:5級算法題 收藏 關註 一個數組的元素為1至N的整數,現在要對這個數組進行排序,在排序時只能將元素放在數組的頭部或尾部,問至少需要移動多少個數字,才能完成整個排序過程? 例如: 2 5 3 4 1 將1移到頭部 => 1 2 5 3 4 將5移到尾部 => 1 2 3 4 5 這樣就排好了,移動了2個元素。 給出一個1-N的排列,輸出完成排序所需的最少移動次數。 Input
第1行:1個數N(2 <= N <= 50000)。 第2 - N + 1行:每行1個數,對應排列中的元素。
輸出1個數,對應所需的最少移動次數。Input示例
5 2 5 3 4 1Output示例
2
代碼如下:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <vector> 6 #include <cmath> 7 #include <queue> 8 #include <stack> 9 #include <map> 10View Code#include <string> 11 #include <set> 12 using namespace std; 13 typedef long long LL; 14 const int INF = 2e9; 15 const LL LNF = 9e18; 16 const int MOD = 1e9+7; 17 const int MAXM = 1e5+10; 18 const int MAXN = 5e4+10; 19 20 int a[MAXN],vis[MAXN], dp[MAXN]; 21 int main() 22 { 23 int n; 24while(scanf("%d",&n)!=EOF) 25 { 26 for(int i = 1; i<=n; i++) 27 scanf("%d",&a[i]); 28 29 int cnt = 0; 30 memset(vis, 0, sizeof(vis)); 31 for(int i = 1; i<=n; i++) 32 { 33 dp[a[i]] = 1; 34 if(vis[a[i]-1]) dp[a[i]] += dp[a[i]-1]; 35 vis[a[i]] = 1; 36 cnt = max(cnt, dp[a[i]]); 37 } 38 printf("%d\n", n-cnt); 39 } 40 }
51Nod 1241 特殊的排序 —— 思維、DP