点击打开 79 拦截导弹 链接
//动态规划 //最长递减(递增)子序列 #include<stdio.h> #include<string.h> #include<iostream> int mh[20],dp[20];///md放导弹高度, using namespace std; int main() { int n,m,i,j; scanf("%d",&n); while(n--) { memset(dp,0,sizeof(dp)); scanf("%d",&m); for(i=0;i<m;i++) scanf("%d",&mh[i]); for(i=1;i<m;i++) for(j=0;j<i;j++) { if(mh[j]>mh[i])//若是求递增将mh[j]>mh[i]换成mh[j]<mh[i] dp[i]=max(dp[i],dp[j]+1); } int maxn=0; //比较dp中最大的数 for(i=0;i<m;i++) maxn=max(dp[i],maxn); printf("%d\n",maxn+1); } return 0; }
点击打开814 又见拦截导弹 链接
//贪心 #include <stdio.h> #include <string.h> int main() { int mh[3005],vt[3005],n;//mh导弹高度,vt遍历 while(scanf("%d",&n)!=EOF) { if(n==-1) break; for(int i=0;i<n;i++) scanf("%d",&mh[i]); memset(vt,0,sizeof(vt)); int sum=0; for(int i=0;i<n;i++) { if(!vt[i]) //如果未被访问 { int p=mh[i]; for(int j=i+1;j<n;j++) //遍历比前一个p小的值 if(!vt[j]&&p>=mh[j]) vt[j]=1,p=mh[j]; sum++; } } printf("%d\n",sum); } return 0; }
不知道咋回事,79题可以动态规划,而814题可以贪心