看了看今天金山居比赛的题,好像就会这一道啊。
一个二维二态的DP,用dp[i][0]表示到第i个数成绩为负数的值,dp[[i][1]表示到第i个数成绩为正数的值。需要特别注意的是,如果dp[i-1][0]是0,a[i]是2,那么dp[i][0]还是0;dp[i][1]也一样。刚开始没有注意这一点儿wa了一次,然后看错数据数组开小了又wa了一次。
啥都不想说了。
#include<stdio.h>
#include<string.h>
#define N 10005
int a[N],dp[N][2];
int Max(int x,int y)
{
return x>y?x:y;
}
int main()
{
int T;
int count;
count=1;
scanf("%d",&T);
while(T--)
{
int i,n;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
memset(dp,0,sizeof(dp));
int sum;
sum=0;
dp[0][0]=0;
dp[0][1]=0;
for(i=1;i<=n;i++)
{
if(a[i]==0)
{
dp[i][0]=0;
dp[i][1]=0;
}
else if(a[i]==2)
{
if(dp[i-1][0]!=0)
dp[i][0]=dp[i-1][0]+1;
dp[i][1]=dp[i-1][1]+1;
}
else
{
dp[i][0]=dp[i-1][1]+1;
if(dp[i-1][0]!=0)
dp[i][1]=dp[i-1][0]+1;
}
sum=Max(sum,dp[i][1]);
}
printf("Case #%d: %d\n",count++,sum);
}
return 0;
}