这场比赛比得非常搓,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;
} Codeforces Round #237 (Div. 2)(D),布布扣,bubuko.com
Codeforces Round #237 (Div. 2)(D)
原文:http://blog.csdn.net/auto_ac/article/details/21648247