拦截导弹 (最长上升子序列LIS)
作者:互联网
1 #include <iostream> 2 #include <stdio.h> 3 #include <algorithm> 4 5 using namespace std; 6 7 int list[26]; // 按袭击事件顺序保存各导弹高度 8 int dp[26]; // dp[i] 保存以第i个导弹结尾的最长不增子序列长度 9 10 11 int main() 12 { 13 int n; 14 while(cin >> n) 15 { 16 for(int i = 1; i <= n; ++i) 17 cin >> list[i]; 18 19 for(int i = 1; i <= n; ++i) // 按照袭击时间顺序确定每一个dp[i] 20 { 21 int tmax = 1; // 最大值的初始值为1,即以其结尾的最长不增子序列长度至少为1 22 for(int j = 1; j < i; ++j) // 遍历其前所有导弹高度 23 if(list[j] >= list[i]) // 若j号导弹不比当前导弹低 24 tmax = max(tmax, dp[j] + 1); // 将当前导弹排列在以j号导弹结尾的最长不增子序列之后,计算其长度dp[j] + 1, 若大于当前最大值,则更新最大值 25 26 dp[i] = tmax; // 将dp[i] 保存为最大值 27 } 28 int ans = 1; 29 for(int i = 1; i <= n; ++i) 30 { 31 ans = max(ans, dp[i]); // 找到以每一个元素结尾的最长不增子序列中的最大值, 该最大值即为答案 32 } 33 cout << ans << endl; 34 35 } 36 37 return 0; 38 }
标签:拦截导弹,26,int,tmax,导弹,LIS,序列,include,dp 来源: https://www.cnblogs.com/FengZeng666/p/11102148.html