HDU1160

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1160

题目大意:给出多个数据组(最多1000个),terminated by end of file,对于第 i 个数据组有两个数据:W[i] 和 S[i],要求找出一串数据组,在这串数据组中,W[i] 递增,对应的 S[I] 递减,要求数据串尽可能长。

解题思路:

  DP。用数组dp[i] 表示以第 i 组数据为结尾的最长长度。

  由于有每组有两个数据,我们可以一上来先对其中一种数据进行排序。我选择先把 W[i] 按从小到大排序,对于W[i] 相同的数据组,我们从大到小排序。这样一来,我们便可以少考虑一种数据,W[i] 已经能够保证合法,只要不是相等的情况。在外层循环中从头枚举各个数据组 i,计算dp[i] ,在内层循环中枚举第1至 i-1 组数据组 j,dp[i] = max( dp[j] + 1),当然,第 i 个数据组要满足W[i] < W[j] && S[i] > S[j]。

  用 pre[] 数组记录路径。

AC代码:

 1 #include <vector>
 2 #include <cstdio>
 3 #include <algorithm>
 4 using namespace std;
 5 const int maxn=1000+10,inf=0x7ffffff;
 6 struct node{
 7     int W,S,ind;
 8 }n[maxn];
 9 int W[maxn],S[maxn],dp[maxn],pre[maxn],path[maxn];
10 bool cmp(const node &a,const node &b){
11     if(a.W<b.W) return 1;
12     else if(a.W==b.W&&a.S>b.S)  return 1;
13     return 0;
14 }
15 int main()
16 {
17     int num=1;
18     while(scanf("%d%d",&n[num].W,&n[num].S)==2){
19         pre[num]=0;
20         n[num].ind=num;
21         dp[num]=1;
22         num++;
23     }
24     sort(n+1,n+num,cmp);
25     int ans=0,aj;
26     for(int i=1;i<num;i++){
27         for(int j=1;j<i;j++){     //因为有了前面的排序,j必须小于i,不然之后的j不合法
28             if(n[j].W<n[i].W&&n[j].S>n[i].S&&dp[i]<dp[j]+1){
29                 dp[i]=dp[j]+1;
30                 pre[i]=j;
31                 if(dp[i]>ans){
32                     aj=i;
33                     ans=dp[i];
34                 }
35             }
36         }
37     }
38
39     int t=0,ti=aj;
40     while(ti!=0){
41         path[t++]=ti;
42         ti=pre[ti];
43     }
44     printf("%d\n",ans);
45     while(t>0){
46         t--;
47         printf("%d\n",n[path[t]].ind);
48     }
49     return 0;
50 }
时间: 2024-08-06 15:39:19

HDU1160的相关文章

hdu1160,FatMouse&#39;s Speed

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

HDU1160:FatMouse&#39;s Speed(最长上升子序列,不错的题)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1160 学的东西还是不深入啊,明明会最长上升子序列,可是还是没有A出这题,反而做的一点思路没有,题意就不多说了,真是怀疑了为什么做这题的时候竟然想用nlog(n)的那个算法, 根本不可能有解啊,真想抽自己一下,最后无奈看了题解,发现他们写的非常棒,记录路径仅用一个数组就可以实现,可惜我没有想到啊,还是做题不深入啊. 首先需要排一下序. 代码如下: #include <iostream> #include

hdu1160 dp

hdu1160 题意:给出很多老鼠的数据,分别是它们的体重和跑速,为了证明老鼠越重跑得越慢,要找一组数据,由若干个老鼠组成,保证老鼠的体重依次增加而跑速依次减小,问这组数据最多能有多少老鼠,并按体重从小到大输出这些老鼠的顺序. 并不是难题,我觉得有点类似穷国富国或者是堆砖块,我的做法就是首先将这些老鼠按体重从大到小排序(为什么从大到小呢,因为我是用结构体模拟指针记录了上一只老鼠的序号,所以最终会倒序输出,排序的时候就按倒序排序了) 昂,介绍下我的结构体,是记录了 w(weight),s(spee

hdu-1160 FatMouse&#39;s Speed 【最长上升子序列】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1160 FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 9965    Accepted Submission(s): 4427 Special Judge Problem Description FatMo

FatMouse&#39;s Speed(HDU-1160)

一道经典的最长子序列题,不过该题需要维护两个量,体重和速度,所以需要先对一个量进行排序,然后剩下的那个量就可以像处理最长子序列那样做了. 值得一提的是该题需要打印路径,最好的方法是用一个数组pre运用类似链表的结构,来记录路径. 这恰恰就是紫书上数据结构那章例题14中所用的记录最短路路径的方法 . 其中的巧妙和实现细节请读者细细品味. 针对这道题, 由于dp是利用之前计算的结果进行递推得到的,因此,每一步的计算都要用到上一步的结.最长上升子序列,就是枚举当前序列的最后一位,然后从前面递推找最优解

hdu1160 LIS变形

题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1160 题意:两个子序列 一个是升序,一个是降序,求最长的子序列是多大,并输出路径.(答案不唯一) 思路都是一样的,不断的更新当前值,优化之前的值,只不过还要记录一下路径. 代码:(注释应该就可以看得懂了) #include<iostream> #include<cstdio> #include<algorithm> #include<cstring>

hdu1160(最长上升子序列)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1160 题意:给定一些小猫的属性:体重和速度.然后求某些猫顺序的排列,使得体重上升,速度下降,这样的排列尽量长. 分析:主要将速度按从大到小排序,然后对体重求最长上升子序列即可,这里因为要记录路径,所以只能O(n^2)求解. #include <cstdio> #include <cstring> #include <cmath> #include <iostream&

dp求顺序hdu1160

题意是仅仅求一次的顺序.先依照速度从大到小排序,速度想等到按体重增序排列. 然后基本就变成了求已定顺序序列的最长递增序列递增,跟那个求一致最大序列和的基本一致. dp[i]里存储的是到当前i最大的递增序列个数最大的数. dp[i+1]就是在a[i+1]大于前面的a[j]的情况下,dp[i+1]=dp[j]+1; 输出的就是从最大的dp[]值从后往前输出,所以用了个栈改成从前往后. 以为题意仅仅输出一个正确序列就好. 思路是从開始的结构体排序.打一打就想出来的.bug,调了一天.确定dp[]最大值

HDU1160(LIS)

主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1160 题意:求体重下降.速度添加的样例最多有多少个 依据体重降序排一下,然后求速度的最长上升子序列 ,经典的LIS问题,记录一下路径 代码例如以下: #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const in