51nod 1241 特殊的排序(DP_找最长等差数列)

一个数组的元素为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>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=50000+10;
int dp[maxn];
int main()
{
	int n,i,j,ans,num;
	scanf("%d",&n);
	ans=0;
	for(i=1;i<=n;i++) {
		scanf("%d",&num);
		dp[num]=dp[num-1]+1;
		ans=max(ans,dp[num]);
	}
	printf("%d\n",n-ans);
	return 0;
}






同HDU某题类似:

dxy家收藏了一套书,这套书叫《SDOI故事集》,《SDOI故事集》有<span class="katex" style="font-size: 1.21em; font-family: KaTeX_Main; line-height: 1.2; white-space: nowrap;"><span class="katex-mathml" style="position: absolute; padding: 0px; border: 0px; height: 1px; width: 1px; overflow: hidden;">n(n\leq 19)</span><span class="katex-html" style="display: inline-block;"><span class="strut" style="display: inline-block; height: 0.75em;"></span><span class="strut bottom" style="display: inline-block; height: 1em; vertical-align: -0.25em;"></span><span class="base textstyle uncramped" style="display: inline-block;"><span class="mord mathit" style="font-family: KaTeX_Math; font-style: italic;">n</span><span class="mopen">(</span><span class="mord mathit" style="font-family: KaTeX_Math; font-style: italic;">n</span><span class="mrel" style="margin-left: 0.27778em;">≤</span><span class="mord" style="margin-left: 0.27778em;">1</span><span class="mord">9</span><span class="mclose">)</span></span></span></span>本,每本书有一个编号,从<span class="katex" style="font-size: 1.21em; font-family: KaTeX_Main; line-height: 1.2; white-space: nowrap;"><span class="katex-mathml" style="position: absolute; padding: 0px; border: 0px; height: 1px; width: 1px; overflow: hidden;">1</span><span class="katex-html" style="display: inline-block;"><span class="strut" style="display: inline-block; height: 0.64444em;"></span><span class="strut bottom" style="display: inline-block; height: 0.64444em; vertical-align: 0em;"></span><span class="base textstyle uncramped" style="display: inline-block;"><span class="mord">1</span></span></span></span>号到<span class="katex" style="font-size: 1.21em; font-family: KaTeX_Main; line-height: 1.2; white-space: nowrap;"><span class="katex-mathml" style="position: absolute; padding: 0px; border: 0px; height: 1px; width: 1px; overflow: hidden;">n</span><span class="katex-html" style="display: inline-block;"><span class="strut" style="display: inline-block; height: 0.43056em;"></span><span class="strut bottom" style="display: inline-block; height: 0.43056em; vertical-align: 0em;"></span><span class="base textstyle uncramped" style="display: inline-block;"><span class="mord mathit" style="font-family: KaTeX_Math; font-style: italic;">n</span></span></span></span>号。
dxy把这些书按编号从小到大,从上往下摞成一摞。dxy对这套书极其重视,不允许任何人动这套书。
有一天Evensgn到dxy家玩,dxy因为和妹子有约会,就让Evensgn自己待在他家。Evensgn对这套书非常好奇,偷偷的看了一下,结果发现这里面竟然有当年小E和小Q的故事。Evensgn看得出神,结果把一摞书的顺序打乱了。
眼看着dxy就要回来了,Evensgn需要尽快把这摞书恢复到原先排好序的状态。由于每本书都非常重,所以Evensgn能做的操作只有把一本书从书堆中抽出来,然后把这本书放到书堆的顶部。
给你打乱的书的顺序,你能帮Evensgn算算最少需要几次上述的操作,他才能把这套书恢复顺序?假如你能算出来的话,Evensgn答应送给你一本他签名的书《SDOI故事集9:小E的故事》

输入描述
输入包含多组数据。
第一行包含一个正整数<span class="katex" style="font-size: 1.21em; font-family: KaTeX_Main; line-height: 1.2; white-space: nowrap;"><span class="katex-mathml" style="position: absolute; padding: 0px; border: 0px; height: 1px; width: 1px; overflow: hidden;">T(T\leq 30)</span><span class="katex-html" style="display: inline-block;"><span class="strut" style="display: inline-block; height: 0.75em;"></span><span class="strut bottom" style="display: inline-block; height: 1em; vertical-align: -0.25em;"></span><span class="base textstyle uncramped" style="display: inline-block;"><span class="mord mathit" style="font-family: KaTeX_Math; font-style: italic; margin-right: 0.13889em;">T</span><span class="mopen">(</span><span class="mord mathit" style="font-family: KaTeX_Math; font-style: italic; margin-right: 0.13889em;">T</span><span class="mrel" style="margin-left: 0.27778em;">≤</span><span class="mord" style="margin-left: 0.27778em;">3</span><span class="mord">0</span><span class="mclose">)</span></span></span></span>表示数据组数。
对于每组数据,第一行为一个正整数<span class="katex" style="font-size: 1.21em; font-family: KaTeX_Main; line-height: 1.2; white-space: nowrap;"><span class="katex-mathml" style="position: absolute; padding: 0px; border: 0px; height: 1px; width: 1px; overflow: hidden;">n</span><span class="katex-html" style="display: inline-block;"><span class="strut" style="display: inline-block; height: 0.43056em;"></span><span class="strut bottom" style="display: inline-block; height: 0.43056em; vertical-align: 0em;"></span><span class="base textstyle uncramped" style="display: inline-block;"><span class="mord mathit" style="font-family: KaTeX_Math; font-style: italic;">n</span></span></span></span>表示这套《SDOI故事集》中有多少本书。
接下来一行<span class="katex" style="font-size: 1.21em; font-family: KaTeX_Main; line-height: 1.2; white-space: nowrap;"><span class="katex-mathml" style="position: absolute; padding: 0px; border: 0px; height: 1px; width: 1px; overflow: hidden;">n</span><span class="katex-html" style="display: inline-block;"><span class="strut" style="display: inline-block; height: 0.43056em;"></span><span class="strut bottom" style="display: inline-block; height: 0.43056em; vertical-align: 0em;"></span><span class="base textstyle uncramped" style="display: inline-block;"><span class="mord mathit" style="font-family: KaTeX_Math; font-style: italic;">n</span></span></span></span>个用空格分开的正整数,表示Evensgn打乱后的这摞书的书号顺序(从上往下)。
输出描述
对于每组数据,输出一行一个整数,表示Evensgn最少需要几次操作才能讲书恢复顺序。
输入样例
2
4
4 1 2 3
5
1 2 3 4 5
输出样例
3
0

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
	int n,a[30],book[30],t,i,j;
	int _;cin>>_;
	while(_--) {
		cin>>n;
		for(i=1;i<=n;i++) {
			cin>>a[i];
			if(a[i]==n) t=i;
		}
		n--;
		for(i=t-1;i>=1;i--) {
			if(a[i]==n) n--;
		}
		cout<<n<<endl;
	}
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值