Title Link: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5170
Test instructions: Queue n soldiers, each soldier three kinds G, R, p optional, for at least m continuous g soldiers, up to the number of K continuous R soldiers arrangement of species.
Detailed Solution: http://blog.csdn.net/cc_again/article/details/24841249
Note the case of negative after taking the mold
#include <cstdio>#include<cstring>#include<cmath>#include<iostream>#include<algorithm>#include<queue>#include<cstdlib>#include<stack>#include<vector>#include<Set>#include<map>#defineLL Long Long#defineMoD 1000000007#defineINF 0x3f3f3f3f#defineN 1000010#defineCLR (a) (Memset (A,0,sizeof (a)))using namespacestd; LL dp[n][3]; LL m,n,k; ll solve (ll U,ll v) {dp[0][0]=1;DP [0][1]=0;DP [0][2]=0; for(intI=1; i<=n;i++) {LL sum= (dp[i-1][0]+dp[i-1][1]+dp[i-1][2])%MoD; dp[i][2]=sum; if(i<=u) dp[i][0]=sum; Else if(i==u+1) dp[i][0]=sum-1; Elsedp[i][0]= (sum-dp[i-u-1][1]-dp[i-u-1][2]+MOD)%MoD; if(I<=V) dp[i][1]=sum; Else if(i==v+1) dp[i][1]=sum-1; Elsedp[i][1]= (sum-dp[i-v-1][0]-dp[i-v-1][2]+MOD)%MoD; } return(dp[n][0]+dp[n][1]+dp[n][2])%MoD;}intMain () { while(SCANF ("%lld%lld%lld", &n,&m,&k) >0) {printf ("%lld\n", ((Solve (K,n)-solve (k,m-1))%mod+mod)%MoD); }}View Code
zoj3747 (Recursive DP)