您的位置:首页 > 其它

hdu 4512 最长公共上升子序列

2014-02-20 09:09 441 查看
首先,这道题要枚举1-n;以这个点为中心把源数据分成两部分,把后面的翻转过来,与前面的求最长公共子序列

#include<cstdio>
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int data[1001],data1[1001],num[1001];
int dp[1000];
int LCS(int n,int m,int t)
{
for(int i=1;i<=n;i++)
for(int j=1,tmp=0;j<=m;j++)
if(data[i]>data1[j] && dp[j]>tmp)
tmp = dp[j];
else
if(data[i]==data1[j])
{
if(i == n&&j==m )
dp[j] = tmp+1;
else
dp[j] = tmp + 2;
}

int ans = 0;
for(int i=1;i<=t;i++)
ans = max(dp[i],ans);
return ans;
}

int main()
{
int n,m;
int icase;
cin>>icase;
while(icase--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&num[i]);
int ans = 0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
data[j] = num[j];
for(int j=n;j>=i;j--)
data1[n-j+1] = num[j];
memset(dp,0,sizeof(dp));
ans = max(ans,LCS(i,n-i+1,n));
}
cout<<ans<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: