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

HDU1160 - FatMouse's Speed - 最长上升子序列的变形+记录路径

时间:2021-04-19 14:43:51      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:hang   out   sizeof   eof   size   using   namespace   while   str   

思路

最长上升子序列的变形+记录路径

AC代码

#include<iostream>
#include<cmath>
#include<string.h>
#include<algorithm>
#include<stdio.h>
#include<iomanip>
#define inf 0x3f3f3f3f
using namespace std;

//最长上升子序列的变形+记录路径
struct node
{
    int w;
    int s;
    int num;
} a[1100];

int dp[1100];
int path[1100];
int ans[1100];

int cmp1(node a,node b)
{
//   if(a.w!=b.w)
    return a.w<b.w;
//   else
    //    return a.s>b.s;
}
int main()
{
    std::ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    memset(a,0,sizeof(a));
    memset(dp,0,sizeof(dp));
    memset(path,0,sizeof(path));
    int p=1;
    while(cin>>a[p].w>>a[p].s)
    {
        a[p].num=p;
        p++;
    }
    //这里需要注意一下
    //输入数据处理到文件末尾的方法
    //末尾无需加分号
    sort(a+1,a+p+1,cmp1);
    //p从1开始

    int maxx=-inf;
    int changexb;
    for(int i=1; i<=p; i++)
        dp[i]=1;
    for(int i=1; i<=p; i++)
    {
        for(int j=1; j<i; j++)
        {
            /*     if(a[j].s>a[i].s&&a[j].w<a[i].w)
                 {
                     dp[i]=max(dp[i],dp[j]+1);
                     path[i]=j;
                     maxx=dp[i];
                     if(dp[i]>=maxx)
                     {
                         maxx=dp[i];
                         changexb=j;
                     }
                 }*/
            if(a[j].s>a[i].s&&a[j].w<a[i].w&&(dp[j]+1>dp[i]))//题目要求重量是从小到大
                // if(a[k].v>a[j].v)//这里需要对模版进行处理
            {
                //dp[a[j].v]=max(dp[a[j].v],dp[a[k].v]+1);
                dp[i]=dp[j]+1;
                maxx=max(maxx,dp[i]);
                path[i]=j;//记录路径,这步非常重要,非常非常
                //    printf("**%d**%d\n",j,k);//看一下结果
                if(dp[i]>=maxx)//因为需要输出最长路径
                {
                    changexb=i;//记录改变后的下标,之后用的到,用于找到原来的下标并且输出原下标
                    maxx=dp[i];
                }
            }
        }
    }
    //  cout<<maxx<<endl;

    int x=changexb;
    int w=0;
    while(x!=0)
    {
        ans[w++]=x;
        x=path[x];

    }
    cout<<w<<endl;
    for(int i=w-1; i>=0; i--)
    {
        cout<<a[ans[i]].num<<endl;
    }

//    for(int i=1;i<=p;i++)
//    {
//        if(path[i])
//        {
//            cout<<path[i]<<endl;
//        }
//    }

//    int q=0;
//    for(int i=0;i<p;i++)
//    {
//        dp[i]=1;
//        for(int j=0;j<i;j++)
//        {
//            if(a[j].w<a[i].w&&a[j].s>a[i].s)
//                dp[i]=max(dp[i],dp[j]+1);
//            b[q++]=dp[i];
//        }
//    }
//    cout<<q<<endl;
//    for(int i=0;i<q;i++)
//        cout<<b[i]<<endl;
    return 0;
}

HDU1160 - FatMouse's Speed - 最长上升子序列的变形+记录路径

标签:hang   out   sizeof   eof   size   using   namespace   while   str   

原文地址:https://www.cnblogs.com/OFSHK/p/14667249.html

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