HDU ACM 4561 连续最大积->DP

分析:dp[i][0]表示到第i个数成绩为负时的最大积个数,dp[i][1]表示到第i个数成绩为正时的最大积个数。

#include<iostream>
using namespace std;

#define N 10005
#define max(a,b) ((a)>(b)?(a):(b))

int dp[N][2];

int main()
{
	int T,t,i,n,sum,x;

	t=1;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&n);
		sum=0;
		dp[0][0]=dp[1][0]=0;
		for(i=1;i<=n;i++)
		{
			scanf("%d",&x);
			if(x==0)
				dp[i][0]=dp[i][1]=0;
			else if(x==2)
			{
				if(dp[i-1][0]!=0)
					dp[i][0]=dp[i-1][0]+1;
				else
					dp[i][0]=0;
				dp[i][1]=dp[i-1][1]+1;
			}
			else if(x==-2)
			{
				dp[i][0]=dp[i-1][1]+1;
				if(dp[i-1][0]!=0)
					dp[i][1]=dp[i-1][0]+1;
				else
					dp[i][1]=0;
			}
			sum=max(sum,dp[i][1]);
		}
		printf("Case #%d: %d\n",t++,sum);
	}
    return 0;
}
时间: 2024-11-13 05:00:31

HDU ACM 4561 连续最大积->DP的相关文章

HDU 1231 最大连续子序列 --- 入门DP

HDU 1231 题目大意以及解题思路见: HDU 1003题解,此题和HDU 1003只是记录的信息不同,处理完全相同. /* HDU 1231 最大连续子序列 --- 入门DP */ #include <cstdio> #include <cstring> int dp[10005]; int main() { #ifdef _LOCAL freopen("D:\\input.txt", "r", stdin); #endif int n

HDU 1231——最大连续子序列(DP)

最大连续子序列 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 18603    Accepted Submission(s): 8268 Problem Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j

HDU 4561 连续最大积 (模拟题)

#include <iostream> #include<cstdio> using namespace std; int a[50000+100],n; int solve(int s,int e) { int i,cnt=0,st,ed,flag=1,ans=0; //if(s==n+1) return 0; for(i=s;i<e;i++) { if(a[i]==-2) { if(flag) { flag=0; st=i;//记录此区间内-2第一次出现的位置 } ed=

hdu 1231 最大连续子序列(DP)

最大连续子序列 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 21166    Accepted Submission(s): 9387 Problem Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j

HDU ACM 4597 Play Game -&gt;区间DP+记忆化搜索

分析:两个人都足够聪明,因此每个阶段都拿最大的.dp[sa][ea][sb][eb]分别表示区间1的开始为sa,结束为ea,区间2的开始为sb,结束为eb时能拿到的最大值.之后分别从四个方向上拿,是个搜索的过程. [cpp] view plaincopyprint? #include<iostream> using namespace std; int dp[25][25][25][25];  //dp[sa][ea][sb][eb],分别表示区间1的开始,结束,区间2的开始,结束 int a

HDU ACM 4734 F(x)-&gt;数位DP入门练习题

分析:数位DP的入门联系题,通过该題对数位DP有感觉了:dp[len][presum]代表长度为len权值不大于presum的数.记忆化搜索提高效率,除边界(因为边界上算出来的答案在其它数中可能是不完整的)外记录dp[len][presum]的值,下次发现以前计算过就直接return:dfs(len, presum, fg)表示求长度为len,不超过pre的全部符合条件的值.fg是控制边界的. #include<iostream> using namespace std; int dp[11]

HDU ACM 1087Super Jumping! Jumping! Jumping!-&gt;DP(动态规划)

分析:简单DP,转移方程dp[j]=max{dp[i]}+a[j];(0<=i<j<n,a[i]<a[j]). #include<iostream> using namespace std; __int64 dp[1001]; int a[1001]; int main() { int i,n,j; __int64 max; while(cin>>n && n) { for(i=0;i<n;i++) cin>>a[i]; m

HDU ACM 1074 Doing Homework-&gt;状态压缩DP(集合上的DP)

分析:n种家庭作业,全部做完有n!种顺序,但是n!太大了,而且对于作业1,2,3和1,3,2和2,1,3和3,2,1和3,1,2的顺序来说完成它们消耗的天数是一样的,只是顺序不同从而扣分不同,所以可将完成相同的作业的所有状态压缩成一种状态并记录扣的最少分即可 . 状态压缩DP采用二制进的思想,1, 0代表完成否,如:3的二进制为11, 代表完成了一,二科目的状态, 101代表完成了一.三科目的状态.这样,可从0->(1 << N)来获取所有状态,,进行适当的状态转移,对于该題D[s]代表

HLG 2116 Maximum continuous product (最大连续积 DP)

链接:  http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=2116 Description Wind and his GF(game friend) are playing a small game. They use the computer to randomly generated a number sequence which only include number 2,0 and -