• hdu 1160(最长递增子序列+输出)


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

    思路:就是排序后求最长递增子序列,只不过多了一个判断(s下降)以及最后输出下标,我们可以用一个pre[]数组来记录路径,最后递归输出就行了。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 #define MAXN 1010
     7 struct Mice{
     8     int w,s,id;
     9 }mice[MAXN];
    10 int n;
    11 int dp[MAXN];
    12 int pre[MAXN];
    13 
    14 int cmp(const Mice &p,const Mice &q){
    15     if(p.w!=q.w)
    16         return p.w<q.w;
    17     return p.s>q.s;
    18 }
    19 
    20 void Print(int x){
    21     if(pre[x]==-1){
    22         printf("%d\n",mice[x].id);
    23         return ;
    24     }
    25     Print(pre[x]);
    26     printf("%d\n",mice[x].id);
    27 }
    28 
    29 
    30 int main(){
    31     int ans,ed,i=1;
    32     while(scanf("%d%d",&mice[i].w,&mice[i].s)==2)mice[i].id=i,i++;
    33     n=i-1;
    34     sort(mice+1,mice+n+1,cmp);
    35     memset(dp,0,sizeof(dp));
    36     memset(pre,-1,sizeof(pre));
    37     for(int i=1;i<=n;i++){
    38         ans=0;
    39         for(int j=1;j<i;j++){
    40             if(mice[i].w>mice[j].w&&mice[i].s<mice[j].s&&ans<dp[j]){
    41                 ans=dp[j];
    42                 pre[i]=j;
    43             }
    44         }
    45         dp[i]=ans+1;
    46     }
    47     ans=0,ed=-1;
    48     for(int i=1;i<=n;i++){
    49         if(dp[i]>ans){ans=dp[i],ed=i;}
    50     }
    51     printf("%d\n",ans);
    52     Print(ed);
    53     return 0;
    54 }
    View Code
  • 相关阅读:
    Linux下pip3安装问题
    客户信息维护jsp
    Java开发环境搭建
    软件开发一般步骤
    PM
    需求分析
    结对编程
    GUI
    spring boot 整合cfx,axis2创建webservice客户端
    webserver 返回json 如何去掉 <string xmlns="http://tempuri.org/">
  • 原文地址:https://www.cnblogs.com/wally/p/3076551.html
Copyright © 2020-2023  润新知