免费馅饼
题意分析:0~10的区间内,初始位置为5.每次移动一个单位,可接到馅饼的区间为x,x-1,x+1。多组输入:每组n个馅饼,t时间在x处掉落。输出:一个回合可接到最多馅饼数。
做题思路:dp
1.dp[t][x]//t时间在x处收到的最大馅饼数
2.边界的话……“补零. 给时刻和位置的计量值都+1, 即可空出一个0位. 这样之后, j的边界变为(1~11), 初始位置为6, 初始时刻为1. 将0位保持为0, 即可简化讨论情况, 不影响结果.”
3.顺序,t倒着推,最大t开始,倒回起点。x无所谓。
4.dp[t][x]+=max(dp[t+1][x-1],dp[t+1][x],dp[t+1][x+1]);
代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> using namespace std; #define INF 0x3f3f3f3f int dp[100010][15];//t秒时x处掉落馅饼 int main() { int n; while ((cin >> n) && n != 0) { memset(dp, 0, sizeof(dp)); int maxt = -INF; for (int i = 0; i < n; i++) { int x, t; cin >> x >> t; dp[++t][++x]++; maxt = max(maxt, t); } for (int i = maxt; i > 0; i--) { for (int j = 1; j <= 11; j++) { dp[i][j] += max(dp[i + 1][j], max(dp[i + 1][j - 1], dp[i + 1][j + 1])); } } cout << dp[1][6] << endl; } return 0; }

浙公网安备 33010602011771号