[简单DP]FatMouse's Speed HDU - 1160
2017-07-31 14:35
134 查看
[简单DP]FatMouse's Speed HDU - 1160
题意:给定一组数,每组包含两个整数。要求输出该组数的一个子集,该子集的第一个数逐渐增大,第二个数逐渐变下。使得这个子集尽可能的大并输出对应小标。
分析:
题目很简单,说白了就是对第一个或者第二个数字排序下,然后求另外一个数字的递减或者递增序列。
由于要输出序列,所以要记录下子集中每组数的前一组数的下标,然后递归输出。
代码:
#include<stdio.h> #include<stdlib.h> #include<string> #include<string.h> #include<algorithm> #include<set> #include<map> #include<vector> #include<queue> #define MAX 9999999999 #define MIN -1 #define ll long long using namespace std; struct node { int w,s; int vis;//重量,速度,和原来的下标 }num[1005]; int dp[1005],pre[1005]; bool cmp(node a,node b) { return a.s>b.s; } void print(int i) { if(i!=pre[i]) print(pre[i]); printf("%d\n",num[i].vis+1);//递归输出答案 } int main() { int cnt=0; while(~scanf("%d %d",&num[cnt].w,&num[cnt].s)) { num[cnt].vis=cnt; cnt++; } sort(num,num+cnt,cmp); for(int i=0;i<=cnt;i++) pre[i]=i;//初始化 dp[0]=1; int Max=1,key=0; for(int i=1;i<cnt;i++)//查找递增子集 { dp[i]=1; for(int j=0;j<i;j++) { if(num[j].w<num[i].w&&dp[j]+1>dp[i]) { dp[i]=dp[j]+1; pre[i]=j;//记录前一结点 } } if(Max<dp[i]) { Max=dp[i]; key=i;//记录最后一个下标 } } printf("%d\n",Max); print(key); return 0; }
相关文章推荐
- FatMouse's Speed HDU - 1160 --dp的路径记忆问题
- hdu 题目1160 FatMouse's Speed (DP)
- FatMouse's Speed HDU - 1160(dp)
- 【DP|LIS+输出路径】HDU-1160 FatMouse's Speed
- 【基础dp路径记录】HDU 1160 FatMouse's Speed
- hdu 1160 FatMouse's Speed 题解(简单dp)
- HDU 1160 FatMouse's Speed(DP)
- J - FatMouse's Speed HDU - 1160——基础dp
- hdu 1160 FatMouse's Speed【dp】
- 基础dp9-- J - FatMouse's Speed HDU - 1160
- hdu1160 FatMouse's Speed--DP&记录路径
- HDU - 1160 FatMouse's Speed(dp)
- HDU - 1160 —— FatMouse's Speed —— dp
- HDU 1160 FatMouse's Speed DP 路径回溯
- 【排序+dp】HDU 1160——FatMouse Speed
- HDU 1160 FatMouse's Speed dp
- hdu 1160 FatMouse's Speed (DP)
- (HDU - 1160)FatMouse's Speed(DP)
- HDU 1160 FatMouse's Speed (DP)
- HDU 1160 FatMouse's Speed (dp)