首页 > 其他 > 详细

HDU 1160 FatMouse's Speed--dP--(元素1递增元素2递降的最长子序列)

时间:2015-06-14 18:40:12      阅读:162      评论:0      收藏:0      [点我收藏+]

题意:找到体重递增速度递降的最长序列

分析:和最长递增子序列一样,不过这里先做处理:先把体重按递增排序,然后找最长递降子序列即可

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
struct node{
	int w,s;
	int t;
}a[2000];
int n,i;
struct h{
	int x;
	int pre;
}dp[2000];
int ans[2000],g;
bool cmp(node p,node q)
{
	if(p.w!=q.w) return p.w<q.w;
	return p.s>q.s;
}
int max(int p,int q)
{
	return p>q?p:q;
}
void prin(int index)
{
	int j=index;
    if(dp[j].pre!=j){
    	prin(dp[j].pre);
    	cout<<a[j].t<<endl;
    }
    else cout<<a[j].t<<endl;
    return;
}
int main()
{
	i=0,g=0;
	int mx=-1,index;
    while(cin>>a[i].w>>a[i].s) i++;
	for(int j=0;j<i;j++){
		a[j].t=j+1;
	}
	sort(a,a+i,cmp);
	for(int j=0;j<i;j++){
	    dp[j].x=1;
	    dp[j].pre=j;
	}
	for(int j=0;j<i;j++){
		for(int k=0;k<j;k++){
			if(a[k].s>a[j].s&&a[k].w!=a[j].w){
				if(dp[j].x<dp[k].x+1){
					dp[j].x=dp[k].x+1;
					dp[j].pre=k;
				}
		}
		if(mx<dp[j].x){
			mx=dp[j].x;
			index=j;
		}
	    }
	}
	cout<<mx<<endl;
	prin(index);
}


HDU 1160 FatMouse's Speed--dP--(元素1递增元素2递降的最长子序列)

原文:http://blog.csdn.net/ac_0_summer/article/details/46491419

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!