用dp终于AC了!
算是打开dp的第一道门T T
计算最大值的时候遗漏了,一开始以为a[n]就是最大值,后来发现不对,a[n]只是最后落脚点是n的时候取得的最大值,最大序列的结尾不一定在n啊!!
修改了这个大bug之后对了hhh
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int lou[105];
int ans;
int n;
void solve()
{
int i,j,ans;
cin>>n;
if (n<=0)
{
cout<<0<<endl;
return ;
}
int a[102];
for (i=1;i<=n;i++)
cin>>lou[i];
for (i=1;i<=n;i++)
a[i]=1;
for (i=2;i<=n;i++)
for (j=1;j<=i-1;j++)
if (lou[j]<lou[i])
a[i]=max(a[i],a[j]+1);
ans=a[1];
/*下面这个关键的循环加上才对*/
for (i=2;i<=n;i++)
ans=max(ans,a[i]);
for (i=1;i<=n;i++)
a[i]=1;
for (i=2;i<=n;i++)
for (j=1;j<=i-1;j++)
if (lou[j]>lou[i])
a[i]=max(a[i],a[j]+1);
for (i=1;i<=n;i++)
ans=max(ans,a[i]);;
cout<<ans<<endl;
}
int main()
{
int times;
cin>>times;
while(times--)
solve();
return 0;
}
——————————————————更新line———————————————————————
用dfs。。。咳咳,超时了
超时代码:
#include<iostream>
#include<string.h>
using namespace std;
int lou[105];
int ans;
int n;
void moveleft(int p,int count)
{
if (p<=0)
{
if (count>ans)
ans=count;
return ;
}
int i;
for (i=p-1;i>=0;i--)
{
if (count+i+1<=ans)
return ;
if (lou[i]<lou[p])
moveleft(i,count+1);
else
{
if (count>ans)
ans=count;
// return;
}
}
}
void moveright(int p,int count)
{
if (p>=n-1)
{
if (count>ans)
ans=count;
return ;
}
int i;
for (i=p+1;i<n;i++)
{
if (count+n-i<=ans)
return ;
if (lou[i]<lou[p])
moveright(i,count+1);
else
{
if (count>ans)
ans=count;
// return;
}
}
}
void solve()
{
int i;
memset(lou,0,sizeof(lou));
cin>>n;
if (n<=0)
{
cout<<"0"<<endl;return ;
}
for (i=0;i<n;i++)
cin>>lou[i];
ans=0;
for (i=0;i<n;i++)
{
moveleft(i,1);
moveright(i,1);
}
cout<<ans<<endl;
}
int main()
{
int times;
cin>>times;
while(times--)
solve();
return 0;
}