Black and White
2017-02-19 15:43
225 查看
[b]Black and White[/b]
题目链接:http://www.ifrog.cc/acm/problem/1091?contest=1012&no=0
DP
按照常规想法会这样定义状态:dp[当前位数i][当前位是否为黑][连续棋子的个数k]为符合状态的方案数,
但是题目中a,b,n均为1e6,不论空间还是时间都不允许这样做,考虑另外的状态定义:
dp[当前位数i][当前位是否为黑]表示符合状态的合法的方案数;
当前位数大于最大连续棋子数(a,b)时,dp[i][1]=dp[i-1][1]+dp[i-1][0]中包含了连续a个黑棋的非法状态,
而连续a个黑棋的非法状态数与dp[i-a][0]相同(第i-a位到第i位只有均为黑一种情况),将其删去即为合法状态;白棋亦然。
于是状态转移方程为:
当i<a&&i<b(从下标1开始)时,
dp[i][1]=dp[i-1][1]+dp[i-1][0];
dp[i][0]=dp[i-1][1]+dp[i-1][0];
当i>=a||i>=b时,
dp[i][1]=dp[i-1][1]+dp[i-1][0];
dp[i][0]=dp[i-1][1]+dp[i-1][0];
dp[i][1]=dp[i][1]-dp[i-a][0];
dp[i][0]=dp[i][0]-dp[i-b][1];
代码如下:
题目链接:http://www.ifrog.cc/acm/problem/1091?contest=1012&no=0
DP
按照常规想法会这样定义状态:dp[当前位数i][当前位是否为黑][连续棋子的个数k]为符合状态的方案数,
但是题目中a,b,n均为1e6,不论空间还是时间都不允许这样做,考虑另外的状态定义:
dp[当前位数i][当前位是否为黑]表示符合状态的合法的方案数;
当前位数大于最大连续棋子数(a,b)时,dp[i][1]=dp[i-1][1]+dp[i-1][0]中包含了连续a个黑棋的非法状态,
而连续a个黑棋的非法状态数与dp[i-a][0]相同(第i-a位到第i位只有均为黑一种情况),将其删去即为合法状态;白棋亦然。
于是状态转移方程为:
当i<a&&i<b(从下标1开始)时,
dp[i][1]=dp[i-1][1]+dp[i-1][0];
dp[i][0]=dp[i-1][1]+dp[i-1][0];
当i>=a||i>=b时,
dp[i][1]=dp[i-1][1]+dp[i-1][0];
dp[i][0]=dp[i-1][1]+dp[i-1][0];
dp[i][1]=dp[i][1]-dp[i-a][0];
dp[i][0]=dp[i][0]-dp[i-b][1];
代码如下:
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <string> #define N 1000005 using namespace std; typedef long long ll; ll m=1e9+7; ll T,a,b,n,dp [2]; int main(void){ std::ios::sync_with_stdio(false); dp[0][1]=dp[0][0]=dp[1][1]=dp[1][0]=1; cin>>T; while(T--){ cin>>a>>b>>n; for(int i=2;i<=n;++i){ dp[i][1]=(dp[i-1][1]+dp[i-1][0])%m; dp[i][0]=(dp[i-1][1]+dp[i-1][0])%m; if(i>=a)dp[i][1]=(dp[i][1]-dp[i-a][0]+m)%m; if(i>=b)dp[i][0]=(dp[i][0]-dp[i-b][1]+m)%m; } cout<<(dp [0]+dp [1])%m<<"\n"; } }
相关文章推荐
- 搜索(剪枝优化):HDU 5113 Black And White
- Ural 2063 Black and White
- “玲珑杯”ACM比赛 Round #10-A-Black and White
- POJ 3364 Black and white painting 再想想
- hdu 3911 Black And White 线段树区间合并
- Hdu 5113 Black and White ---2014北京现场赛B题
- hdu 3911 black and white 线段树区间合并
- HDU5583 Kingdom of Black and White
- HDU5583 Kingdom of Black and White(连通块暴力)
- 【HDU - 3911】Black And White 【线段树+区间操作+区间合并】
- HDU 5583 Kingdom of Black and White
- HDU 3911 Black And White 2011 Multi-University Training Contest 8 - Host by HUST 线段树应用
- HDU 3911 Black And White 分段树 题解
- hdu3911 Black And White 线段树区间合并
- HDU 5113 Black And White
- HDU OJ 1802 white and black board
- HDOJ5113 Black And White【dfs+剪枝】
- HUD 3911 Black And White 线段树 区间更新 + 区间合并
- hdu3911 Black And White--区间更新 & 懒惰标记
- HDU - 5113 Black And White(棋盘涂色dfs搜索+剪枝)