[hdu1176]免费馅饼(数塔dp)
题意:中文题,不解释了 = =
解题关键:逆推,转化为数塔dp就可以了
dp[i][j]表示在i秒j位置的最大值。
转移方程:$dp[i][j] = \max (dp[i + 1][j],dp[i + 1][j - 1],dp[i + 1][j + 1])$
#include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> using namespace std; typedef long long ll; int dp[100002][20]; int main(){ ios::sync_with_stdio(0); int n,x,t; while(cin>>n&&n){ memset(dp,0,sizeof dp); for(int i=0;i<n;i++){ cin>>x>>t; dp[t][x+1]++; } for(int i=100000-2;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[0][6]<<"\n"; } return 0; }