Light OJ 1145 Dice (I) (DP)
2016-02-12 16:34
387 查看
解析:设dp[i][j]为考虑前i个骰子,和为j的方案数。
状态转移时,dp[i][j+1....j+k+1]都要加上dp[i][j]。
直接转移的话复杂度为n*k*m。
借助树状数组区间增减的思想,对需要更改的区间的两端进行标记,这样复杂度为n*m。
[code]:
状态转移时,dp[i][j+1....j+k+1]都要加上dp[i][j]。
直接转移的话复杂度为n*k*m。
借助树状数组区间增减的思想,对需要更改的区间的两端进行标记,这样复杂度为n*m。
[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 S[maxn],E[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 tmp,a,b,c; memset(S,0,sizeof(S)); memset(E,0,sizeof(E)); S[0] = 1; for(i = 1;i <= n;i++){ for(j = 0;j < m;j++){ a = j+1,b = min(j+k+1,m+1); E[a] = (E[a]+S[j])%MOD; E[b] = ((E[b]-S[j])%MOD+MOD)%MOD; } tmp = 0; for(j = 0;j <= m;j++){ tmp = (tmp+E[j])%MOD; S[j] = tmp;E[j] = 0; } } printf("Case %d: %lld\n",T,S[m]); } return 0; }
相关文章推荐
- 51nod 独木舟问题
- ubuntu取消每次的错误报告
- 关于Activity的生命周期和启动模式(附Demo)
- Rack
- dd命令刻录u盘启动盘
- Android 编程下 Touch 事件的分发和消费机制
- Java正则表达式特殊字符
- 最大连续两段不相交字段和(poj2594,poj2479)
- Android Layout 之 RelativeLayout
- Asp.Net alert弹出提示信息的几种方法总结
- sql server 如何批量update数据
- 欢迎使用CSDN-markdown编辑器
- nefuoj-1041:字符串变形记
- 关于asp.net三种重定向方法的总结
- 【小作品】STM32无线WIFI视频小车制作剖析(下)
- iOS 【UIKit-转换坐标系(1)】
- App Manifest详解
- ViewPagerIndicator的使用
- 1019. 数字黑洞 (20)
- 图的色数