首页 > 其他 > 详细

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

时间:2014-03-21 01:48:56      阅读:416      评论:0      收藏:0      [点我收藏+]

这场比赛比得非常搓,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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!