Codeforces Round #237 (Div. 2)(D)

来源:互联网 发布:卡特里娜飓风 知乎 编辑:程序博客网 时间:2024/04/30 16:03

这场比赛比得非常搓,cf已经连跌7场了,从紫变绿,算是很少见的了吧,在这几场跌分的比赛中我一直在反思为什么老是这样,今天把头发剪短了些,让自己换一种状态做题,提醒自己必须要注意的一点,做一道题,先想清楚了再写。赛后苦逼地补了D题,最近做DP感觉自己智商实在不行,花了比较长的时间,智商实在是不行。小小总结一下这个比较常见的题型

D

方法一:(我的做法)

dp[i][j]

j = 0 表示i行为0

j = 1表示i行为1,i-1行不为雷

j = 2表示i行为1,i-1行为雷

j = 3表示i行为2

j = 4表示i行为雷

状态转移见代码1


方法二:

dp[i][j]

j=0表示i 行i+1行都为数字

j=1表示i 行为数字,i+1行为雷

j=2表示i行为雷,i+1行为数字

j=3表示i行i+1行都为雷

状态转移见代码2


代码1:

#include <cstdio>#include <cstring>#include <algorithm>#include <vector>using namespace std;const int N = 1000006;const int mod = 1e9+7;int dp[N][5];char s[N];int n;void add(int &x, int y) {x += y;if(x >= mod) x -= mod;}int main(){int i, j;scanf("%s", s+1);n = strlen(s+1);dp[0][0] = dp[0][1] = 1;for(i = 1; i <= n; i++) {bool g = (s[i] == '?');if(g || s[i]=='0') {add(dp[i][0], dp[i-1][0]);add(dp[i][0], dp[i-1][2]);}if(g || s[i] == '1') {add(dp[i][1], dp[i-1][0]);add(dp[i][1], dp[i-1][2]);add(dp[i][2], dp[i-1][4]);}if(g || s[i] == '2') {add(dp[i][3], dp[i-1][4]);}if(g || s[i] == '*') {add(dp[i][4], dp[i-1][4]);add(dp[i][4], dp[i-1][1]);add(dp[i][4], dp[i-1][3]);}}int ans = 0;bool g = (s[n] == '?');if(g || s[n] == '0') {add(ans, dp[n][0]);}if(g || s[n] == '1') {add(ans, dp[n][2]);}if(g || s[n] == '2') {add(ans, 0);}if(g || s[n] == '*') {add(ans, dp[n][4]);}printf("%d\n", ans);return 0;}


代码二:

#include <cstdio>#include <cstring>#include <algorithm>#include <vector>using namespace std;const int N = 1000006;const int mod = 1e9+7;int dp[N][6];char s[N];int n;void add(int &x, int y) {x += y;if(x >= mod) x -= mod;}int main() {int i, j;scanf("%s", s+1);n = strlen(s+1);dp[0][0] = dp[0][1] = 1;for(i = 1; i <= n; i++) {int g = (s[i] == '?');if(g || s[i] == '0') {add(dp[i][0], dp[i-1][0]);}if(g || s[i] == '1') {add(dp[i][1], dp[i-1][0]);add(dp[i][0], dp[i-1][2]);}if(g || s[i] == '2') {add(dp[i][1], dp[i-1][2]);}if(g || s[i] == '*') {add(dp[i][3], dp[i-1][3]);add(dp[i][3], dp[i-1][1]);add(dp[i][2], dp[i-1][3]);add(dp[i][2], dp[i-1][1]);}}bool g = (s[n] == '?');int ans = 0;if(g || s[n] == '2')add(ans, 0);if(g || s[n] == '0' || s[n] == '1')add(ans, dp[n][0]);if(g || s[n] == '*')add(ans, dp[n][2]);printf("%d\n", ans);return 0;} 


1 0