标签:des blog http java os strong io for
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 157 Accepted Submission(s): 39
说是送分题,真是忧伤,,,,
送分应该就是送罚时把==
算是状态dp吧
dp[i] 表示 i 状态下的方案数。
i 化为二进制时 ,第一位为 1 表示有和为1 的存在,0表示没有,第二位为 1 时表示有和为 2的存在
第三位为 1 时表示有和为 3的存在...
转移:sta = i|(1<<(k-1))|(i<<j&m) ;
表示 i 的状态转移到了 sta状态
假如当前的状态 为 3 二进制就是 11,表示有和为 1,2的存在,
如果加上 3 ,那么 3 的状态就可以达到,也就是 |(1<<(3-1))
还有3可以和1,2加,也就是 原来的加上 3 ,也就是左移 3 位 |(i<<j)&m
因为大于 k的和我们是不在意的,所以最大的状态就是 (1<<k)-1 ;
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #define maxn 100010 #define mod 1000000007 #define LL long long using namespace std; int dp[(1<<20)+10] ; int main() { int i ,n,m,k,j ; int T ,L ; cin >> T ; while( T-- ) { scanf("%d%d%d",&n,&k,&L) ; memset(dp,0,sizeof(dp)) ; dp[0]=1 ; m = (1<<k)-1 ; int tot = 0 ; if(L > k) { tot = L-k ; L = k ; } while(n--) { for( i = m ; i >= 0 ;i--) { if(dp[i]==0) continue ; j = dp[i] ; LL tmp = (LL)tot*dp[i]%mod ; for( int u = 1 ; u <= L ;u++) { int sta = (i|(1<<(u-1))|((i<<u)&m)) ; dp[sta] += j ; dp[sta] %= mod; } dp[i] = (dp[i]+tmp)%mod ; } } LL ans = 0 ; for( i = 0 ; i <= m ;i++) if((i>>(k-1))&1) { ans = (ans+dp[i])%mod ; } cout << ans << endl; } return 0 ; }
hdu 4906 Our happy ending,布布扣,bubuko.com
标签:des blog http java os strong io for
原文地址:http://www.cnblogs.com/20120125llcai/p/3883896.html