这道题还是体现了我思维能力比较弱。虽然很容易想到把问题转化成LCS和LDS。但是碰到盘子大小相同时,就把我给难住了……(和又一次周赛的一道DP如出一辙!)
看了题解才知道,可以先把LCS和LDS先dp出来,然后再用2个for扫一遍就可以得出结果了。思维还是被局限了,老想改dp来解决问题啊,思维还是得多加锻炼!
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
#define M 1010
int n;
int a[M];
int dp1[M],dp2[M];
int main()
{
freopen("in.txt","r",stdin);
while(cin>>n&&n)
{
for(int i=0;i<n;i++)
{
cin>>a[i];
}
dp1[n-1]=dp2[n-1]=1;
int ans=1;
for(int i=n-2;i>=0;i--)
{
dp1[i]=dp2[i]=1;
for(int j=n-1;j>i;j--)
if(a[j]>a[i])
{
dp1[i]=max(dp1[i],dp1[j]+1);
}
else if(a[j]<a[i])
{
dp2[i]=max(dp2[i],dp2[j]+1);
}
else
{
dp1[i]=max(dp1[i],dp1[j]+1);
dp2[i]=max(dp2[i],dp2[j]+1);
}
}
for(int i=0;i<n;i++)
{
ans=max(ans,max(dp1[i],dp2[i]));
for(int j=i+1;j<n;j++)
{
if(a[i]==a[j]) continue;
if(a[i]>a[j])
ans=max(ans,dp1[i]+dp2[j]);
else ans=max(ans,dp2[i]+dp1[j]);
}
}
cout<<ans<<endl;
}
return 0;
}