码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-06-14 18:42:23      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:hdu   dp   

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

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

代码:

#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递降的最长子序列)

标签:hdu   dp   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!