Light OJ 1193 Dice (II) (DP)
2016-02-13 22:04
330 查看
解析:
设dp[i][j]为考虑前i个骰子和为j的score的和。
dp[0][0] = 1;
dp[i][j] = sigma(k*dp[i-1][j-k]) (1<=k<=K)。
我现在仍然想用类似BIT区间增减的方法对两端进行标记,然而对于dp[i-1][j]来说,
dp[i][j+1] += 1*dp[i-1][j]
.....
dp[i][j+k] += k*dp[i-1][j]
对于每一项都有一个常数,我们可以这样拆解:k*dp[i-1][j] = (j+k)*dp[i-1][j] - j*dp[i-1][j]。j+k是标号位置,j*dp[i-1][j]是与k无关的常数。所以可以分两部分进行记录,即对端点记录
dp[i-1][j]和j*dp[i-1][j]。
这样一来就可以在O(NS)的时间内AC。
设dp[i][j]为考虑前i个骰子和为j的score的和。
dp[0][0] = 1;
dp[i][j] = sigma(k*dp[i-1][j-k]) (1<=k<=K)。
我现在仍然想用类似BIT区间增减的方法对两端进行标记,然而对于dp[i-1][j]来说,
dp[i][j+1] += 1*dp[i-1][j]
.....
dp[i][j+k] += k*dp[i-1][j]
对于每一项都有一个常数,我们可以这样拆解:k*dp[i-1][j] = (j+k)*dp[i-1][j] - j*dp[i-1][j]。j+k是标号位置,j*dp[i-1][j]是与k无关的常数。所以可以分两部分进行记录,即对端点记录
dp[i-1][j]和j*dp[i-1][j]。
这样一来就可以在O(NS)的时间内AC。
: [code]#include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<algorithm> using namespace std; typedef long long LL; const int maxn = 15005; const LL MOD = 1e8+7; int n,k,m; LL dp[maxn],A[maxn],B[maxn]; int main(){ int i,j,cas,T; scanf("%d",&cas); for(T = 1;T <= cas;T++){ scanf("%d%d%d",&n,&k,&m); LL o1,o2,a,b,c; memset(dp,0,sizeof(dp)); memset(A,0,sizeof(A)); memset(B,0,sizeof(B)); dp[0] = 1; for(i = 1;i <= n;i++){ for(j = 0;j < m;j++){ a = j+1,b = min(j+k+1,m+1); A[a] = (A[a]+dp[j])%MOD; B[a] = (B[a]+dp[j]*j)%MOD; A[b] = ((A[b]-dp[j])%MOD+MOD)%MOD; B[b] = ((B[b]-dp[j]*j)%MOD+MOD)%MOD; } o1 = o2 = 0; for(j = 0;j <= m;j++){ o1 = (o1 + A[j])%MOD; o2 = (o2 + B[j])%MOD; dp[j] = ((o1*j-o2)%MOD+MOD)%MOD; A[j] = B[j] = 0; } } printf("Case %d: %lld\n",T,dp[m]); } return 0; }
相关文章推荐
- lnmp一键编译安装的脚本
- 快速掌握Lua 5.3 —— 面向对象编程
- iOS-网络七层模型&&网络数据包
- 【HDOJ】4345 Permutation
- 使用spring web flow遇到的问题-1
- android自动弹出软键盘(输入键盘)
- Android ProgressDialog进度条使用详解
- 多重背包转01背包/母函数(1171)
- LVS的DR模式
- 静态编译与动态编译的区别
- iOS --- 根据字符串的实际大小来计算UILabel的size
- bindService与startService
- 软件project师的属性与发展
- hdu 5627 Clarke and MST(最大 生成树)
- codeblock中没有gcc编译器的解决方案
- 使用node-inspector调试nodejs程序<nodejs>
- 【BZOJ 2301】[HAOI2011]Problem b
- POJ 1741 Tree 树分治
- BZOJ 1564: [NOI2009]二叉查找树( dp )
- 第二十二天