题目地址:http://acm.hdu.edu.cn/showproblem.php pid=1176
为了使问题简化,假设在接下来的一段时间里,馅饼都掉落在0-10这11个位置。开始时gameboy站在5这个位置,因此在第一秒,他只能接到4,5,6这三个位置中其中一个位置上的馅饼。问gameboy最多可能接到多少个馅饼?(假设他的背包可以容纳无穷多个馅饼)
Input< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPgrK5Mjryv2+3dPQtuDX6aGjw7/X6cr9vt21xLXa0rvQ0M6q0tTV/dX7yv1uKDA8bjwxMDAwMDApo6yx7cq+09BuuPbP2rH9tfTU2tXizPXQob62yc+ho9TaveHPwsC0tcRu0NDW0KOsw7/Q0NPQwb249tX7yv14LFQoMDxUPDEwMDAwMCksse3KvtTatdpUw+vT0NK7uPbP2rH9tfTU2ni148nPoaPNrNK7w+vW09TazazSu7Xjyc+/ycTctfTPwrbguPbP2rH9oaNuPTDKscrkyOu94cr4oaM8YnI+CgogCjxicj4KPHN0cm9uZz5PdXRwdXQ8L3N0cm9uZz4Kw7/Su9fpyuTI68r9vt221NOm0rvQ0Mrks/aho8rks/bSu7j21fvK/W2jrLHtyr5nYW1lYm951+624L/JxNy907W9bbj2z9qx/aGjPGJyPgrM4cq+o7qxvszitcTK5Mjryv2+3cG/sci9z7Tzo6y9qNLp08NzY2FuZrbByOujrNPDY2luv8nE3Lvhs6zKsaGjPGJyPgo8YnI+CgogCjxicj4KPHN0cm9uZz5TYW1wbGUgSW5wdXQ8L3N0cm9uZz4KCjxwcmUgY2xhc3M9"brush:java;">6 5 1 4 1 6 1 7 2 7 2 8 3 0
Sample Output
4
状态pie[i][j]表示i时刻在坐标j出最多能接到的馅饼数。
状态转移方程:
pie[i][j] = Max(pie[i+1][j-1], pie[i+1][j], pie[i+1][j+1]) + pie[i][j].
最后pi[0][5]即为所求结果。
#include#include #include #define MAX 100001 int pie[MAX][12]; /*pie[i][j]表示在i时刻落在j点的馅饼数量*/ int MaxOf2(int a, int b){ return (a > b) a : b; } int MaxOf3(int a, int b, int c){ int max = (a > b) a : b; return (max > c) max : c; } int MaxNumOfPie(int max_time){ int i, j, max; for (i = max_time - 1; i >= 0; --i){ pie[i][0] = MaxOf2(pie[i+1][0], pie[i+1][1]) + pie[i][0]; /*printf("%d ", pie[i][0]);*/ for (j = 1; j < 10; ++j){ pie[i][j] = MaxOf3(pie[i+1][j-1], pie[i+1][j], pie[i+1][j+1]) + pie[i][j]; /*printf ("%d ", pie[i][j]);*/ } pie[i][10] = MaxOf2(pie[i+1][10], pie[i+1][9]) + pie[i][10]; /*printf ("%d\n", pie[i][10]);*/ } return pie[0][5]; } int main(void){ int n; int i; int time; int location; int max_time; while (scanf("%d", &n) != EOF && n != 0){ memset(pie, 0, sizeof(pie)); max_time = -1; for (i=1; i<=n; ++i){ scanf ("%d%d", &location, &time); ++pie[time][location]; if (max_time < time) max_time = time; } printf ("%d\n", MaxNumOfPie(max_time)); } return 0; }