思路:稍加分析下就可以看出来,这道题目是求最长子序列的问题,标准的动态规划问题,从题目中可以得知,拦截系统得拦截高度依次降低,所以一开始我是打算求最长下降子序列,后来发现行不通,这种方法只能够求出每次最多拦截得导弹得个数。所以就开始改变方法,后来发现,如果后面得导弹得高度比前面得高,那么一次肯定不能拦截完,所以只要求出最长上升子序列,就可以求出需要的最少拦截系统。又显而易见求最长子序列的状态转移方程为:dp[i] = max(dp[i],dp[j] + 1);
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <cstdlib> #include <algorithm> using namespace std; int main(){ int *a,n,*dp; while(~scanf("%d",&n)){ a = (int *)malloc((n + 1) * sizeof(int)); dp = (int *)malloc((n + 1) * sizeof(int)); for(int i = 0; i < n; i ++) scanf("%d",&a[i]); for(int i = 0; i < n; i ++) dp[i] = 1; for(int i = 1; i < n; i ++) for(int j = 0; j < i; j ++) if(a[i] >= a[j]) dp[i] = max(dp[i],dp[j] + 1); int Max = 0; for(int i = 0; i < n; i ++) if(Max < dp[i]) Max = dp[i]; printf("%d\n",Max); } return 0; }
