【九度OJ】题目1262:Sequence Construction puzzles(I)_构造全递增序列

来源:互联网 发布:pkpm节能计算软件 编辑:程序博客网 时间:2024/06/03 21:43

这是一道典型的LIS问题,属于动态规划类,之前做老是WA,但是我测试了N次组100个随机数据组,跟别人的正确答案比对,样子都是完全吻合。殊不知其实里面有个字符是不同的,就是我一开始输出的时候用的"ends",这个字符在微软库里面写是起终止字符串的作用,也就是说它并不是空字符。之前第一次还用的是二维的dp,错了,但是答案也一样,估计也是这个原因。


Here is my code:


#include<stdio.h>#include<iostream>#include<string.h>#include<math.h> using namespace std; int main(){    //freopen("input.txt","r",stdin);      int N;     while(scanf("%d",&N)!=EOF)     {        int seq[N];        int dp[N],path[N],save[N];        int maxn=-1,maxj;        memset(path,-1,sizeof(path));        memset(save,0,sizeof(save));        for(int i = 0 ;i<N;i++)        {            scanf("%d",&seq[i]);            dp[i] = 1;        }        for(int i = 0;i<N;i++)        {            for(int j = i;j<N;j++)            {                if(seq[i]<seq[j])                {                    if(dp[j]<dp[i]+1)                        path[j] = i;                    dp[j] = max(dp[i]+1,dp[j]);   //如果j序列比i序列+1大的话,继续用j序列,否则更新j序列                }            }        }        for(int i = 0;i<N;i++)        {            if(dp[i]>maxn)            {                maxn = dp[i];                maxj = i;            }        }        int maxi = maxn;        save[maxi] = seq[maxj];        while(path[maxj]!=-1)        {            maxi--;            save[maxi] = seq[maxj];            maxj = path[maxj];        }        save[0] = seq[maxj];        for(int i = 0;i<maxn;i++)        {            cout<<save[i];            if(i!=maxn-1)                cout<<" ";         }         cout<<endl;        }     return 0;}            /**************************************************************    Problem: 1262    User: xing9634    Language: C++    Result: Accepted    Time:30 ms    Memory:1520 kb****************************************************************/