1. 程式人生 > 實用技巧 >免費餡餅

免費餡餅

題意分析: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; }