HDU 1176 免费馅饼
可以说想了好多时间。。。但是最终还是想出来了。。。
感觉是DAG上的DP,dp[i][j]表示到第i分钟,第j个位置最多能接的数量。
dp[i][j]有三个来源:
状态转移方程:dp[i][j]=dp[i][j]+max(dp[i-1][j-1],dp[i-1][j],dp[i-1][j+1]) ;
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int maxn=100000+10; int n; int dp[maxn][15]; int main() { while(~scanf("%d",&n)) { if(!n) break; memset(dp,0,sizeof dp); int MaxT=0; for(int i=0; i<n; i++) { int x,T; scanf("%d%d",&x,&T); MaxT=max(MaxT,T); dp[T][x]++; } dp[0][5]=1; for(int i=1; i<=MaxT; i++) { for(int j=0; j<=10; j++) { int Max=0; if(j-1>=0) Max=max(Max,dp[i-1][j-1]); Max=max(Max,dp[i-1][j]); if(j+1<=10) Max=max(Max,dp[i-1][j+1]); dp[i][j]+=Max; } } int ans=0; for(int i=0; i<=10; i++) ans=max(ans,dp[MaxT][i]); printf("%d\n",ans-1); } return 0; }