题解:
此题有两个问题,第一求这套系统最多能拦截多少导弹,第二个求如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
第一个问题即为求最长下降子序列,不多阐述。
对于第二个问题我是用贪心求解的。
对于每一个处在i位置的导弹,它可以和(从1到i-1位置且还没有被击落的)任一大于等于其高度的导弹共在一套装置(意思即为无需添置新的装置),在此想既然是选一个符合要求的导弹共处一套装置,则选对于之后的更有利的导弹(即为选比位置i导弹高度高的所有导弹中高度最小的那个,可以好好思考一下为何如此选)。
AC代码:
#include<iostream> using namespace std; const int Max = 1e5 + 5; int lst[7], dp[7][2];//一个用来存放dp,一个用来存放贪心。至于为啥数组开这么小,因为发现这题数据是个伪1w,总共连10个导弹都没有,开个7就过了... int g = 0; int main() { int t; while (cin >> t) { lst[++g] = t; } for (int i = 1; i <= g; i++) { dp[i][0] = 1; int f = i, f1 = 1e9 + 5; for (int j = 1; j < i; j++) { if (lst[i] <= lst[j]) dp[i][0] = max(dp[i][0], dp[j][0] + 1); if (dp[j][1] && lst[j] >= lst[i] && lst[j] < f1) { f = j; f1 = lst[j]; } } dp[f][1] = 0; dp[i][1] = 1; } int ma = -9, sum = 0; for (int i = 1; i <= g; i++) { ma = max(dp[i][0], ma); sum += dp[i][1]; } cout << ma << endl << sum; }