某国为了防御敌国的导弹袭击,发展中一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于等于前一发的高度。某天,雷达捕捉到敌国导弹来袭。由于该系统还在试用阶段,所以只用一套系统,因此有可能不能拦截所有的导弹。
2 8 389 207 155 300 299 170 158 65 3 88 34 65
6 2
本题的数量级很小, 用不着动态规划,但是为了学习一下动态规划,我还是用dp解决这题
如果之前接触过类似于最长上升子序列这种题的话,那么这题应该很容易解决
这题的本质就是找到最长下降子序列,状态转移方程:d[i] = max(d[i - 1] + 1, d[i]);
就是当当前位置的高度小于前面位置的高度, 那么当前位置的长度就等于前一个位置的长度加1于当前未知长度的最大值
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define N 25 int a[N]; int d[N]; int main(){ int t, m, i, j; scanf("%d", &t); while (t--){ memset(d, 0, sizeof(d)); scanf("%d", &m); for (i = 0; i < m; i++) scanf("%d", &a[i]); for (i = 0; i < m; i++){ for (j = i + 1; j < m; j++){ if (a[j] <= a[i]) d[j] = max(d[j], d[i] + 1); } } printf("%d\n", *max_element(d, d + m) + 1); } return 0; }
原文地址:http://blog.csdn.net/u013174702/article/details/44942883