HDU 1176 —— 免费馅饼

原题:http://acm.hdu.edu.cn/showproblem.php?pid=1176


dp[i][j]表示位置i在j时刻能拿到的最多馅饼,从后往前推(因为我们知道起始位置),最后求得答案就是dp[5][0];

状态转移: i = 0          dp[0][j] += max(dp[0][j+1], dp[1][j+1]);

 i = 10        dp[10][j] += max(dp[10][j+1], dp[9][j+1]);

   1 ≤ i ≤ 9       dp[i][j] += max(dp[i-1][j+1], dp[i][j+1], dp[i+1][j+1]);



#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>

using namespace std;
const int maxn = 1e5+5;
int n;
int dp[15][maxn];

int main()
{
	while(~scanf("%d", &n))
	{
		if(n == 0)	break;
		memset(dp, 0, sizeof dp);
		int maxtime = 0;
		for(int i = 1;i<=n;i++)
		{
			int x, t;
			scanf("%d%d", &x, &t);
			maxtime = max(maxtime, t);
			dp[x][t]++;
		}
		for(int j = maxtime-1;j>=0;j--)
		{
			dp[0][j] += max(dp[0][j+1], dp[1][j+1]);
			dp[10][j] += max(dp[10][j+1], dp[9][j+1]);
			for(int i = 1;i<10;i++)
			{
				dp[i][j] += max(dp[i-1][j+1], max(dp[i][j+1], dp[i+1][j+1]));
			}
		}
		printf("%d\n", dp[5][0]);
	}
	return 0;
}


你可能感兴趣的:(HDU 1176 —— 免费馅饼)