您的位置:首页 > 其它

hdu 1176:免费馅饼

2012-07-25 13:33 375 查看
hdu1176: http://poj.org/problem?id=1179
题意:有一一维坐标系,从0编号到10,一个人站在5上,现在天上正在掉馅饼,这个人每秒只能移动一个单位,所以第一秒只能接住掉在4、5、6上的馅饼,现给出某个点在某个时间  点有馅饼,问最多能接到多少馅饼
解法:dp:dp[i][j]表示直到第j秒站在i上接到的最多馅饼数,则有转移方程:dp[i][j]=v[i][j]+max(dp[i-1][j-1],dp[i][j-1],dp[i+1][j-1])。
code:


#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int inf = 1 << 29;
#define MAX 100050
int dp[13][MAX],v[13][MAX], n;
int max(int a,int b)
{
if(a>b)
return a;
else
return b;
}
int main()
{
while(1)
{
scanf("%d",&n);
if(n==0)break;
int T = 0, x, t;
memset(dp, 0, sizeof(dp));
memset(v,0,sizeof(v));
for(int i = 0; i < 13; i++)
{
dp[i][0] = -inf;       //也可不用v,直接用dp代替
v[i][0]=-inf;
}
dp[6][0] = 0;         //初始状态为0
for(int i = 0; i < n; i++)
{
scanf("%d%d", &x, &t);
v[x+1][t]++;            //此处用到一点技巧,将坐标系往右移一位,则后面的j-1不会出现为负数
T = max(T, t);
}
for(int i = 1; i <= T; i++)
for(int j = 1; j <= 11; j++)
dp[j][i]=v[j][i]+max(dp[j-1][i-1], max(dp[j][i-1], dp[j+1][i-1]));
int ans = 0;
for(int i = 1; i <= 11; i++)
ans = max(ans, dp[i][T]);         //取最大值
printf("%d\n",ans);
}
return 0;
}
/*input:
6
5 1
4 1
6 1
7 2
7 2
8 3
0
output:
4*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: