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

HDU 1160 FatMouse's Speed

时间:2015-04-29 10:08:03      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:dp

刚开始输入写错了,最后还会接收一次值的

这道题如果只有一个维度,那么直接排序之后顺序输出就行了,但这里有二维,排序之后有一些点不能同时选,就需要决择了

先将所有老鼠按我们需要的大小关系排个序,然后就相当于求个最长上升子序列了

像这种第i个状态的值会和前面某数是什么有关系的,直接把前面的扫描一遍取最值就好了

感觉做dp的题,有两点很重要

一个是状态方程,这是解题的关键

还有一个就是状态初始化,这是保证不会WA的关键

#include<stdio.h>
#include<string>
#include<math.h>
#include<algorithm>
const int inf=999999;
using namespace std;
int dp[1005];//第i个数的最长递增子序列长度的最大值 
struct Mice{
	int w,s,pre,p;
	Mice(){
	}
}a[1005];
int cmp(Mice a,Mice b) {
	if(a.w!=b.w) return a.w<b.w;
	else return a.s>b.s;
}
void output(int post){
	if(a[post].pre==-1){
		printf("%d\n",a[post].p);
		return;
	}
	output(a[post].pre);
	printf("%d\n",a[post].p);
}
int main(){
	#ifndef ONLINE_JUDGE
	freopen("in.txt","r",stdin);
	#endif
	int n=1;
	a[0].w=0;a[0].s=inf;
	
	while(scanf("%d%d",&a[n].w,&a[n].s)!=EOF) n++;
	n--;//最后接收了一次空值 
	
	
	for(int i=1;i<=n;i++) a[i].p=i;
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++) dp[i]=1;
	for(int i=1;i<=n;i++) a[i].pre=-1;
	for(int i=2;i<=n;i++){
		for(int j=1;j<i;j++){
			if(a[j].w<a[i].w&&a[j].s>a[i].s){
				if(dp[j]+1>dp[i]) {
					dp[i]=dp[j]+1;
					a[i].pre=j;
				}
			}
		}
	}
	//for(int i=1;i<=n;i++) printf("%d %d\n",a[i].w,a[i].s);
	
	int ma=0,post;
	for(int i=1;i<=n;i++){
		if(dp[i]>ma){
			ma=dp[i];
			post=i;
		}
	}
	printf("%d\n",dp[post]);
	output(post);
}


HDU 1160 FatMouse's Speed

标签:dp

原文地址:http://blog.csdn.net/lj94093/article/details/45342607

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