hdu1160(记录路径)

这题状态转移方程很容易找dp[ i ]=max( dp[ i ] , dp[ j ]+1 )  0<=j<i,  但是为什么我要把它放到我的博客呢,因为题目还要求我们记录路径,这是我第一次做记录路径的DP,一开始搞晕了,wa了好多次 。

代码如下:

#include<iostream>
#include<algorithm>
#include<string>
#include<stack>
#include<queue>
#include<map>
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<time.h>
#include<math.h>

#define N  10005
#define eps 1e-9
#define P system("pause")
using namespace std;

struct node {
    int weight,speed;
    int id;
    friend bool operator<(node a,node b)
    {
         if(a.weight != b.weight) return a.weight<b.weight;
         return    a.speed>b.speed;
    }   
}s[N];
int dp[N];
int path[N];
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);cc
         int i,j,maxx,flag;
         i=0;
         while(scanf("%d%d",&s[i].weight,&s[i].speed)!=EOF){
               i++;
               s[i].id=i;
         }
         sort(s,s+i);
         int n=i;
         maxx=0;
         memset(dp,0,sizeof(dp));
         for(i=0;i<n;i++)
            path[i]=i;        //用于记录路径 
         for(i=0;i<n;i++) 
         {
            for(j=0;j<i;j++)
            {
                 if(s[i].weight>s[j].weight && s[i].speed<s[j].speed )
                      if(dp[j]>dp[i]){
                          dp[i]=dp[j];
                          path[ s[i].id ]=s[j].id; //  s[i].id的祖先是s[j].id 
                      }
            }
            dp[i]+=1;
            if(dp[i]>maxx){
               maxx=dp[i];
               flag=s[i].id;
            }
         }
         printf("%d\n",maxx);
         stack<int> q;
         while(path[flag]!=flag)
         {
             q.push(flag);
             flag=path[flag];                       
         } 
           q.push(flag);   
         while(!q.empty()){
             printf("%d\n",q.top());
             q.pop();                 
         }  
   // P;                               
    return 0;    
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值