可以说想了好多时间。。。但是最终还是想出来了。。。
感觉是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#include #include #include 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 =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;}