题目来源:OpenJudge - 012:拦截导弹
鸣谢北京大学郭炜老师、北京大学POJ
推荐郭炜老师的算法课:程序设计与算法(二)算法基础_北京大学_中国大学MOOC(慕课)
做一个解题记录,方便有需要的人一起交流学习,也方便自己以后回顾。
题目如图所示:
//动态规划解题,这实际上是求最长不上升子序列的长度
#include<cstdio>
const int maxK = 25;//最大导弹数量
int height[maxK];//导弹高度
int dp[maxK];//dp[i]表示第i枚导弹是拦截到的导弹序列的最后一枚时,拦截到的最大导弹数量
int main()
{
int k;
scanf("%d",&k);
int max = 0;
for (int i = 0; i < k; i++)
{
scanf("%d",&height[i]);
dp[i] = 1;//假设第i枚是拦截到的最后一枚导弹时,只拦截到了这一枚导弹
for (int j = 0; j < i; j++)
{
if (height[i] <= height[j] && dp[i] < dp[j] + 1)
dp[i] = dp[j] + 1;
}
if (dp[i] > max)
max = dp[i];
}
printf("%d",max);
return 0;
}