1. 程式人生 > >HDU 1176 免費餡餅

HDU 1176 免費餡餅

IT AS 轉移 turn str pac 遞推 去掉 ++

令dp[i][j]為i時刻j位置時的最大餡餅量。由於每個狀態只能由臨近的3個狀態轉移而來,所以可以較為簡單的確定遞推式。

第一個要思考的點:正推還是逆推?逆推的好,正推的話不知哪些狀態可走,而逆推的話,是在當前狀態下確定之前的狀態,所以不存在這個問題。

第二個思考的點:為什麽答案是dp[0][6],6是因為為了去掉越界的判斷,把位置從[0,10]映射到了[1,11],0是因為,1時刻可能在4、5、6的位置,所以dp[1][6]並不能代表0時刻5開始的答案,上拔一層即可。

#include <iostream>
#include <bits/stdc++.h>
using
namespace std; #define ll long long #define mst(a,b) memset(a,b,sizeof(a)) #define rep(i,a,b) for(ll i=(a);i<(b);++i) const int inf = 0x3f3f3f3f, maxN = 1e5 + 5; int dp[maxN][20]; #define max3(a,b,c) max(max(a,b),c) int main() { // freopen("data.in", "r", stdin); int n, x, t, m;
while (~scanf("%d", &n) && n) { mst(dp, 0); m = 0; while (n--) { scanf("%d%d", &x, &t); ++dp[t][x + 1]; m = max(m, t); } for (int i = m - 1; i >= 0; --i) for (int j = 14; j >= 0; --j) dp[i][j]
+= max3(dp[i + 1][j], dp[i + 1][j - 1] , dp[i + 1][j + 1]); printf("%d\n", dp[0][6]); } return 0; }

HDU 1176 免費餡餅