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

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

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

代码:

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

时间: 2024-11-15 13:06:35

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

HDU 1160 FatMouse&#39;s Speed DP题解

本题就先排序老鼠的重量,然后查找老鼠的速度的最长递增子序列,不过因为需要按原来的标号输出,故此需要使用struct把三个信息打包起来. 查找最长递增子序列使用动态规划法,基本的一维动态规划法了. 记录路径:只需要记录后继标号,就可以逐个输出了. #include <stdio.h> #include <algorithm> using namespace std; const int MAX_N = 1005; struct MouseSpeed { int id, w, s; b

hdu 1160 FatMouse&#39;s Speed(dp)

http://acm.hdu.edu.cn/showproblem.php?pid=1160 #include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <queue> using namespace std; struct Node { int w,s,id,fa; }; Node mice[1000+10]; int dp[100

HDU - 1160 FatMouse&#39;s Speed(dp+路径记录)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1160 题意:给定x组老鼠的重量(W)和速度(S).求使得   W[m[1]] < W[m[2]] < ... < W[m[n]]       S[m[1]] > S[m[2]] > ... > S[m[n]] 的最长序列长度和路径 题解:排序一下,然后LIS,路径记录一下,输出就可以了 1 #include <iostream> 2 #include <a

HDU 1160 FatMouse&#39;s Speed 简单DP

FatMouse's Speed Problem Description FatMouse believes that the fatter a mouse is, the faster it runs. To disprove this, you want to take the data on a collection of mice and put as large a subset of this data as possible into a sequence so that the

HDU 1160 FatMouse&#39;s Speed (sort + dp)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1160 给你一些老鼠的体重和速度,问你最多需要几只可以证明体重越重速度越慢,并输出任意一组答案. 结构体按照体重从小到大排序,然后根据速度就是最长下降子序列. 1 //#pragma comment(linker, "/STACK:102400000, 102400000") 2 #include <algorithm> 3 #include <iostream> 4

[dp专题]hdu 1160 FatMouse&#39;s Speed

FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 10172    Accepted Submission(s): 4521Special Judge Problem Description FatMouse believes that the fatter a mouse is, the faster i

HDU 1160 FatMouse&#39;s Speed (最長單調子序列 dp)

鏈接: http://acm.hdu.edu.cn/showproblem.php?pid=1160 Problem Description FatMouse believes that the fatter a mouse is, the faster it runs. To disprove this, you want to take the data on a collection of mice and put as large a subset of this data as pos

HDU 1160 FatMouse&#39;s Speed (动规+最长递减子序列)

FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 9174    Accepted Submission(s): 4061 Special Judge Problem Description FatMouse believes that the fatter a mouse is, the faster

HDU 1160 FatMouse&#39;s Speed 动态规划 记录路径的最长上升子序列变形

题目大意:输入数据直到文件结束,每行两个数据 体重M 和 速度V,将其排列得到一个序列,要求为:体重越大 速度越低(相等则不符合条件).求这种序列最长的长度,并输出路径.答案不唯一,输出任意一种就好了. 题目思路:这是个最长上升子序列的问题,我们按W的升序进行排序,若W相等则按V的降序排序.用Pre[]记录当前点的前驱节点,Last记录序列最后一个点,maxn记录最长长度,完成动规后可根据Last和Pre[]输出路径. #include<cstdio> #include<stdio.h&

hdu 1160 FatMouse&#39;s Speed(最长不下降子序列+输出路径)

题意: FatMouse believes that the fatter a mouse is, the faster it runs. To disprove this, you want to take the data on a collection of mice and put as large a subset of this data as possible into a sequence so that the weights are increasing, but the s