UVA - 10131 Is Bigger Smarter?(dp+最大升序子序列)
2014-11-06 15:41
471 查看
题目分析:
找出重量从小到大、智商从大到小排列的最长子序列。
并输出这些序列的编号。
解题思路:
1、对大象按IQ从大到小排序。
2、用最大升序子序列的方法,按照重量从小到大,求出最多的大象,用路径path[i]记下j(i之前那头大象)。
3、输出最长序列的长度,并递归输出路径。
找出重量从小到大、智商从大到小排列的最长子序列。
并输出这些序列的编号。
解题思路:
1、对大象按IQ从大到小排序。
2、用最大升序子序列的方法,按照重量从小到大,求出最多的大象,用路径path[i]记下j(i之前那头大象)。
3、输出最长序列的长度,并递归输出路径。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 1010; struct Node { int w,s,id; }e ; int n; int dp ,ans ,path ; bool cmp(Node a,Node b) { return a.s > b.s; } void print_path(int cur) { if(dp[cur] == 1) { printf("%d\n",e[cur].id); return; } print_path(path[cur]); printf("%d\n",e[cur].id); } int main() { n = 0; while(scanf("%d%d",&e .w,&e .s) != EOF) { e .id = n+1; n++; } sort(e,e+n,cmp); for(int i = 0; i < n; i++) { dp[i] = 1; path[i] = i; } int maxx = 0 , pos = 0; for(int i = 1; i < n; i++) { int maxd = 0; for(int j = 0; j < i; j++) { if(e[i].w > e[j].w && dp[j] > maxd) { maxd = dp[j]; path[i] = j; //i之前的那个大象 } } dp[i] = maxd + 1; if(maxx < dp[i]) { maxx = dp[i]; pos = i; } } printf("%d\n",maxx); print_path(pos); return 0; }
相关文章推荐
- UVA 10131 Is Bigger Smarter? (DP,最长条件子序列)
- uva 10131 Is Bigger Smarter ? (简单dp 最长上升子序列变形 路径输出)
- UVA 10131 - Is Bigger Smarter?非连续的单调递增的最长子序列的长度
- UVA 10131 Is Bigger Smarter? 【严格单调递增子序列】
- UVA 10131 Is Bigger Smarter?
- UVA 10131 Is Bigger Smarter? DP
- Is Bigger Smarter? - UVa 10131 dp
- uva 10131 Is Bigger Smarter? dag 最长路 加路径还原
- uva 10131 Is Bigger Smarter?
- UVa 10131 - Is Bigger Smarter?
- uva:10131 - Is Bigger Smarter?
- UVA10131 Is Bigger Smarter? 简单动态规划
- UVa Problem 10131 Is Bigger Smarter? (越大越聪明?)
- UVA 10131 - Is Bigger Smarter? (动态规划)
- UVa 10131 - Is Bigger Smarter?
- UVA - 10131 Is Bigger Smarter? 最长上升子序列
- UVA 10131 - Is Bigger Smarter?
- UVA 10131-Is Bigger Smarter?
- uva_10131 Is Bigger Smarter?
- UVa 10131 - Is Bigger Smarter?