1. 程式人生 > >51Nod 1241 特殊的排序 —— 思維、DP

51Nod 1241 特殊的排序 —— 思維、DP

too 算法題 空間限制 技術 retext .html tcs 進行 ron

題目鏈接: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個數,對應排列中的元素。
Output
輸出1個數,對應所需的最少移動次數。
Input示例
5
2
5
3
4
1
Output示例
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>
10
#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; 24
while(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 }
View Code

51Nod 1241 特殊的排序 —— 思維、DP