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