您的位置:首页 > 其它

hdu 4512吉哥系列故事——完美队形I(动态规划LCIS)

2016-07-14 16:49 363 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4512

RT,很容易发现这是一个最长公共递增子序列问题。

不过这道题数据很小,n只有200,理论上直接暴力应该是可以过的,未尝试。

很久没写动态规划了,手残调试了很久,具体见代码吧。。。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;

#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r

typedef long long ll;
const int INF=0x3f3f3f3f;
const int maxn=1e3;
int T,n,m;
int a[maxn],b[maxn];
int dp[maxn];

int main(){
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
freopen("test.out","w",stdout);
#endif
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",a+i);
b[i]=a[i];
}
reverse(b+1,b+n+1);
memset(dp,0,sizeof(dp));
int ans=0;
for(int i=1;i<=n;i++){
int k=0;
for(int j=1;j<=n-i+1;j++){
if(a[i]==b[j]){
if(i+j!=n+1){
dp[j]=max(dp[j],dp[k]+2);
}
else{
dp[j]=max(dp[j],dp[k]+1);
}
}
else if(a[i]>b[j]&&dp[k]<dp[j])
k=j;
ans=max(ans,dp[j]);
}
}
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: