您的位置:首页 > 其它

hdu1176 免费馅饼

2013-01-08 21:58 155 查看
类似与 数塔问题

用 dp[j][i] 表示 第j个位置,i秒的接的最多饼数。

但是在 j = 0 只能从1 到达,所以有两种选择
dp[j][i - 1] += max ( dp[j + 1][i], dp[j][i] )



j = 10 只能从9 到达 有两种选择 dp[j][i - 1] += max ( dp[j - 1][i], dp[j][i] )



j =1 ~ 9 有三种选择
dp[j][i - 1] += max ( dp[j][i], dp[j - 1][i], dp[j + 1][i] )


输出dp[5][0]
即可


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

using namespace std;
int dp[11][100001];
int maxx ( int a, int b, int c ) {
return max ( max ( a, b ), max ( b, c ) );
}

int main ( ) {
int n, i, j, x, t;
while ( scanf ( "%d", &n ) != EOF && n ) {
memset ( dp, 0, sizeof ( dp ) );
int Max = 0;
for ( i = 1; i <= n; ++i ) {
scanf ( "%d%d", &x, &t );
dp[x][t]++;
Max = max ( Max, t );
}

for ( i = Max; i >= 1; --i ) {
for ( j = 0; j <= 10; ++j ) {
if ( j == 0 ) dp[j][i - 1] += max ( dp[j + 1][i], dp[j][i] );
else if ( j == 10 ) dp[j][i - 1] += max ( dp[j][i], dp[j - 1][i] );
else {
dp[j][i - 1] += maxx ( dp[j][i], dp[j - 1][i], dp[j + 1][i] );
}
}
}

printf ( "%d\n", dp[5][0] );
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: