poj 1887解题报告
2014-12-23 20:16
344 查看
题目要求的是最长下降子序列的长度。长度为n的串的最长子序列长度必定存在最优子结构。
证明:
若序列{x1,x2x3...xn}的最长下降子序列为{y1,y2,y3,y4...yk},不妨假设yk=xm。则{y1,y2,y3...yk}也一定是序列{x1,x2,x3...xm}的最长子序列。否则,一定存在p>k,使得序列{x1,x,x3...xn}的最优解为p>k。与假设矛盾。
因此,可以采用dp 的做法。
dp数组初始化为1.
dp[i]表示以第i位为结尾的最长下降子序列的长度。
dp[i]=max(dp[j]+1),(0<=j<i<n&&num[j]>=num[i])
最后选出最大的dp值为ans。
算法复杂度为O(n^2)
证明:
若序列{x1,x2x3...xn}的最长下降子序列为{y1,y2,y3,y4...yk},不妨假设yk=xm。则{y1,y2,y3...yk}也一定是序列{x1,x2,x3...xm}的最长子序列。否则,一定存在p>k,使得序列{x1,x,x3...xn}的最优解为p>k。与假设矛盾。
因此,可以采用dp 的做法。
dp数组初始化为1.
dp[i]表示以第i位为结尾的最长下降子序列的长度。
dp[i]=max(dp[j]+1),(0<=j<i<n&&num[j]>=num[i])
最后选出最大的dp值为ans。
算法复杂度为O(n^2)
#include <cstdio> using namespace std; int afx[32768]; int dp[32768]; int main() { for(int c=1;;c++) { scanf("%d",afx); if(afx[0]==-1) break; int i; for(i=1;;i++) { scanf("%d",afx+i); if(afx[i]==-1) break; } for(int a=0;a<i;a++) dp[a]=1; int ans=1; for(int b=1;b<i;b++) { int max=1; for(int j=0;j<b;j++) if(afx[j]>=afx[b]&&dp[j]+1>max) max=dp[j]+1; dp[b]=max; if(max>ans) ans=max; } printf("Test #%d:\n maximum possible interceptions: %d\n\n",c,ans); } return 0; }
相关文章推荐
- POJ 2756 二叉树 解题报告
- POJ 2979 陪审团的人选 解题报告
- POJ 1207 The 3n + 1 problem 解题报告
- POJ 1204-Word Puzzles解题报告
- POJ 1838 解题报告
- POJ 2421 解题报告
- poj解题报告——2299
- POJ 2513 解题报告
- POJ 3352 Road Construction解题报告
- POJ1014解题报告
- POJ-2386-Lake Counting-解题报告
- 解题报告 poj 1087
- POJ 1149 PIGS 解题报告
- POJ 2455 解题报告
- 并查积初步之poj1611解题报告
- POJ - 3026 Borg Maze解题报告(Kruskal+Bfs)
- POJ_1007:DNA Sorting解题报告
- poj 1118 2606解题报告
- POJ-2965题The Pilots Brothers' refrigerator解题报告
- poj――校门外的树解题报告