ACM萌新的历练之路(1)
题目链接
思路:看其它博客提到了DP(动态规划)思想,个人目前也不是很懂,感觉与递归、分治有些相似,把一个大问题分解成若干个小问题然后解决。这题求连续最大积,0作为分界点,非0的只有2、-2,即必然是2的x次,即求2的指数。然后注意下特殊的地方,正负得负,负负得正。上代码。
#include<stdio.h>
#include<string.h>
int dp[2][10010];//dp[0]乘积为负的连续个数,dp[1]乘积为正的连续个数。
int main()
{
int t,n,x,i,j;
scanf("%d",&t);
for(i=1;i<=t;i++)
{
memset(dp,0,sizeof(dp));//初始化很重要,在循环内初始化。
int max=0;
scanf("%d",&n);
for(j=1;j<=n;j++)
{
scanf("%d",&x);
if(x>0)
{
dp[1][j]=dp[1][j-1]+1;
if(dp[0][j-1])dp[0][j]=dp[0][j-1]+1;//正负得负。
}
else if(x==0)
{
dp[1][j]=0;
dp[0][j]=0;
}
else
{
dp[0][j]=dp[1][j-1]+1;//这里是个坑,个人是代入数字模拟出来的。
if(dp[0][j-1])dp[1][j]=dp[0][j-1]+1;//负负得正## 。
}
if(dp[1][j]>max)max=dp[1][j];
}
printf(“Case #%d: %d\n”,i,max);
}
}