zoukankan      html  css  js  c++  java
  • HDU1160

    思路

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

    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
    ",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;
    }
    
  • 相关阅读:
    谈谈 在 .Net 生态里为什么没有 Hadoop 系列 ?
    谈谈在 .Net 平台上的 软件生态 和 软件生产力
    我发起了一个 用 物理服务器 和 .Net 平台 构建云平台 的 .Net 开源项目
    推荐一个 基于 WebSocket 和 Redis 的 即时通信 开源项目
    漫谈 12306 架构
    在提交代码的时候分支上出现detached head
    地铁线路查询算法
    .NET 动态脚本语言
    Socket连接池
    比较JqGrid与XtraGrid
  • 原文地址:https://www.cnblogs.com/OFSHK/p/14667249.html
Copyright © 2011-2022 走看看