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

这是一道典型的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
****************************************************************/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值