hdu 5965 扫雷 ccpc 2016 合肥站
2016-11-06 21:06
519 查看
传送门
分析:
dp题目计dp[i][j][k]为到第i个位置,上下一共放j个雷,前面一格放k个雷个方案数。
枚举一下第i−2位的雷数与第i−1位的雷数,那么第i位的雷数可以算出来。
如果放两个或不放,数目保持不变;放一个的话前一个状态乘2。
坑爹的是这道题模的是1e8+7,WA了一下午,真是坑死了。
代码:
分析:
dp题目计dp[i][j][k]为到第i个位置,上下一共放j个雷,前面一格放k个雷个方案数。
枚举一下第i−2位的雷数与第i−1位的雷数,那么第i位的雷数可以算出来。
如果放两个或不放,数目保持不变;放一个的话前一个状态乘2。
坑爹的是这道题模的是1e8+7,WA了一下午,真是坑死了。
代码:
/*****************************************************/ //#pragma comment(linker, "/STACK:1024000000,1024000000") #include <map> #include <set> #include <ctime> #include <stack> #include <queue> #include <cmath> #include <string> #include <vector> #include <cstdio> #include <cctype> #include <cstring> #include <sstream> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; #define offcin ios::sync_with_stdio(false) #define sigma_size 26 #define lson l,m,v<<1 #define rson m+1,r,v<<1|1 #define slch v<<1 #define srch v<<1|1 #define sgetmid int m = (l+r)>>1 #define ll long long #define ull unsigned long long #define mem(x,v) memset(x,v,sizeof(x)) #define lowbit(x) (x&-x) #define bits(a) __builtin_popcount(a) #define mk make_pair #define pb push_back #define fi first #define se second const int INF = 0x3f3f3f3f; const ll INFF = 1e18; const double pi = acos(-1.0); const double inf = 1e18; const double eps = 1e-9; const ll mod = 1e8+7; const int maxmat = 10; const ull BASE = 133333331; /*****************************************************/ inline void RI(int &x) { char c; while((c=getchar())<'0' || c>'9'); x=c-'0'; while((c=getchar())>='0' && c<='9') x=(x<<3)+(x<<1)+c-'0'; } /*****************************************************/ const int maxn = 1e4 + 5; ll dp[maxn][3][3]; char s[maxn]; int main(int argc, char const *argv[]) { int T; cin>>T; while (T --) { s[0] = '0'; memset(dp, 0, sizeof(dp)); scanf("%s", s + 1); int N = strlen(s) - 1; if (N == 1) { if (s[1] == '0') puts("1"); else if (s[1] == '1') puts("2"); else if (s[1] == '2') puts("1"); else puts("0"); } else { dp[0][0][0] = 1; dp[1][0][0] = 1, dp[1][1][0] = 2, dp[1][2][0] = 1; for (int i = 2; i <= N; i ++) { for (int p = 0; p < 3; p ++) { for (int q = 0; q < 3; q ++) { int j = s[i - 1] - '0' - p - q; if (j == 0) dp[i][j][q] = (dp[i][j][q] + dp[i - 1][q][p]) % mod; else if (j == 1) dp[i][j][q] = (dp[i][j][q] + dp[i - 1][q][p] * 2) % mod; else if (j == 2) dp[i][j][q] = (dp[i][j][q] + dp[i - 1][q][p]) % mod; } } } ll ans = 0; for (int i = 0; i < 3; i ++) { int tmp = s - '0' - i; if (tmp > 2 || tmp < 0) continue; ans = (ans + dp [i][tmp]) % mod; } printf("%I64d\n", ans); } } return 0; }
相关文章推荐
- 2016ccpc 合肥站hdu 5965 扫雷
- hdu 5963 朋友 ccpc 2016 合肥站
- hdu 5961 传递 ccpc 2016 合肥站
- 2016 CCPC Hefei Onsite [HDU 5961、5963、5965、5969]
- hdu 5963 朋友(2016ccpc 合肥站 C题)
- hdu 5961 传递 (2016ccpc 合肥站 A题)
- hdu 5969 最大的位或 ccpc 2016 合肥站
- HDU 5965 扫雷 CCPC合肥
- HDU-5702-Solving Order【2016CCPC女生专场】
- hdu 5965 扫雷
- HDU 5920 Ugly Problem 高精度减法大模拟 ---2016CCPC长春区域现场赛
- HDU --- 5965 扫雷 【dp + 思维】
- CCPC 2016安徽大学站 I 朋友 hdu 5969
- hdu 5929 Basic Data Structure 2016CCPC东北地区大学生程序设计竞赛
- 2016ccpc杭州赛 hdu 5934 K.Kingdom of Obsession
- (HDU 5922)Minimum’s Revenge 思维水题 <2016CCPC东北地区大学生程序设计竞赛 - 重现赛 >
- 2016 ccpc HDU 5969 最大的位或
- HDU 5938 && 2016CCPC杭州 F: Four Operations
- HDU 5965 扫雷(递推)
- 2016 ccpc长春现场赛J Sequence II(hdu 5919)