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]
即可
用 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] ); } }
相关文章推荐
- HDU1176 免费馅饼 经典DP
- 【HDU1176】免费馅饼
- hdu1176 免费馅饼 DP
- 【HDU1176】免费馅饼(类数塔问题)
- hdu1176 免费馅饼 动态规划
- 解题报告 HDU1176 免费馅饼
- HDU1176 免费馅饼
- HDU1176:免费馅饼(DP)
- HDU1176 免费馅饼
- HDU1176----免费馅饼
- HDU1176 免费馅饼(水DP)
- [HDU1176]-免费馅饼
- hdu1176 免费馅饼(变形数塔)
- HDU1176:免费馅饼(dp,数字三角形的应用)
- hdu1176 免费馅饼 (动态规划)
- HDU1176-免费馅饼
- 免费馅饼 hdu1176 动态规划 数塔
- HDU1176-免费馅饼(DP)
- 【hdu1176】免费馅饼+动态规划
- HDU1176:免费馅饼