免費餡餅
阿新 • • 發佈:2020-08-05
題意分析: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; }