您的位置:首页 > 其它

HDU 1257 最少拦截系统 LIS最长不减子序列

2010-08-24 15:10 441 查看
解题思路: 一开始没有想到是最大不减子序列,但是后来看了别人的解题报告并且自己分析了一下,真的就是最长不减子序列!用dp[i]表示第i个位置上的所需要的导弹系统数量!把它当做最简单的LIS做就ac了!后来我仔细考虑了一下,改了一下,结果却wa了!不知道怎么回事!还是以后再来再想想吧---- 下面是ac代码:完全是当做LIS做的:

#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
int dp[10000];
int main()
{
int N,i,j,a[10000],maxtemp;
while(scanf("%d",&N)!=EOF)
{
for(i=0;i<N;i++)
scanf("%d",&a[i]);
dp[0]=1;
for(i=1;i<N;i++)
{
maxtemp=0;
for(j=0;j<i;j++)
{
if(a[i]>=a[j]&&dp[j]>maxtemp)
maxtemp=dp[j];
}
dp[i]=maxtemp+1;
printf("dp[%d]=%d/n",i,dp[i]);
}
maxtemp=0;
for(i=0;i<N;i++)
maxtemp=max(maxtemp,dp[i]);
printf("%d/n",maxtemp);
}
return 0;
}


 

后来自己重新考虑了一下写了个另外的代码,但是交上去挖了:

牛人如果愿意看看是什么原因,希望可以得到牛人的提示留言,谢谢:

#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
int dp[100];
int main()
{
int N,i,j,k,a[100],maxtemp;
while(scanf("%d",&N)!=EOF)
{
for(i=0;i<N;i++)
scanf("%d",&a[i]);
dp[0]=1;
for(i=1;i<N;i++)
{
maxtemp=0;
if(a[i]>=a[i-1])
{
for(k=0;k<i;k++)
maxtemp=max(maxtemp,dp[k]);
}
dp[i]=maxtemp+1;
//			printf("dp[%d]=%d/n",i,dp[i]);
}
maxtemp=0;
for(i=0;i<N;i++)
maxtemp=max(maxtemp,dp[i]);
printf("%d/n",maxtemp);
}
return 0;
}


谢谢---
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ini