uva10401Injured Queen Problem(递推)

题目:uva10401Injured Queen Problem(递推)

题目大意:依然是在棋盘上放皇后的问题,这些皇后是受伤的皇后,攻击范围缩小了。攻击范围在图中用阴影表示(题目)。然后给出棋盘的现状,???3?4:在一个6*6的棋盘上,由于皇后是能够列向攻击的,所以一列仅仅能放一个皇后,所以第一个?代表第一列的皇后放的行未知,这样3的意思就是第4列皇后在第三行。也就是确定了第4列皇后的位置。

要求棋盘上的皇后不互相攻击。问这种棋盘能够有多少不同的放法。

解题思路:一開始想状态。想把不同的棋盘作为状态,可是发现这种状态太多了。

后面才发现由于是求总共的数目,那么在放第i个皇后的时候,事实上前面的i - 1个皇后我们仅仅须要知道有多少种放法就能够,并不须要将i - 1个皇后在棋盘上不同的情况都记录下来。依据皇后的攻击范围写出状态方程:d【i】【j】代表第i列的皇后放在第j行。d【i】【j】 = sum (d【i - 1】【k】)

k >= 0 && k < n(棋盘的行或列) && abs (k - j ) > 1.

代码:

#include <cstdio>
#include <cstring>
#include <cstdlib>

typedef long long ll;
const int N = 20;

ll dp[N][N];
char str[N];
int len;

void init () {

	memset (dp, 0, sizeof (dp));
	for (int i = 0; i < len; i++)
		dp[0][i] = 1;
}

int translate (int i) {

	if (str[i]  >= ‘1‘ && str[i] <= ‘9‘)
		return str[i] - ‘1‘;
	else {

		switch (str[i]) {
			case ‘A‘ : return 9;
			case ‘B‘ : return 10;
			case ‘C‘ : return 11;
			case ‘D‘ : return 12;
			case ‘E‘ : return 13;
			case ‘F‘ : return 14;
		}
	}
}

void handle (int i, int j) {

	for (int k = 0; k < len; k++) {
		if (abs (k - j) > 1)
			dp[i][j] += dp[i - 1][k];
	}
}

int main () {

	while (scanf ("%s" , str) != EOF) {

		len = strlen (str);
		init ();

		for (int i = 1; i < len; i++) {

			if (str[i - 1] == ‘?‘) {
				for (int j = 0; j < len; j++)
					handle(i, j);

			} else {

				int k = translate (i - 1);
				for (int j = 0; j < len; j++) {

					if (abs (j - k) > 1)
						dp[i][j] += dp[i - 1][k];
				}
			}
		}

		ll ans;
		if (str[len - 1] != ‘?‘)
			ans = dp[len - 1][translate(len - 1)];
		else {

			ans = 0;
			for (int i = 0; i < len; i++)
				ans += dp[len - 1][i];
		}

		printf ("%lld\n", ans);
	}
	return 0;
}
时间: 2024-11-05 18:50:14

uva10401Injured Queen Problem(递推)的相关文章

hdu 5104 Primes Problem (素数+递推)

Problem Description Given a number n, please count how many tuple(p1, p2, p3) satisfied that p1<=p2<=p3, p1,p2,p3 are primes and p1 + p2 + p3 = n. Input Multiple test cases(less than 100), for each test case, the only line indicates the positive int

ACM学习历程—SNNUOJ 1110 A Simple Problem(递推 &amp;&amp; 逆元 &amp;&amp; 组合数学 &amp;&amp; 快速幂)(2015陕西省大学生程序设计竞赛K题)

Description Assuming a finite – radius “ball” which is on an N dimension is cut with a “knife” of N-1 dimension. How many pieces will the “ball” be cut into most?However, it’s impossible to understand the following statement without any explanation.L

HDU 4291 A Short problem 短问题 (递推,微变型)

题意:给出递推式 g(n) = 3g(n - 1) + g(n - 2),且g(1) = 1,g(0) = 0.求g( g( g(n))) mod 109 + 7. 思路:要求的g( g( g(n)))一共里外3层.看到时间限制1s,数据最大10^18,必定不能老实递推,要么有循环,要么用通项公式.这里用通项公式太麻烦了,数字不好算,而g(n)%109 + 7是有规律的, 在n=222222224之后会出现循环,也就是n=0和n=222222224的g(n)是一样的,这是最外层.那么也就是说在g

hdu 1757 A Simple Math Problem (构造矩阵解决递推式问题)

题意:有一个递推式f(x) 当 x < 10    f(x) = x.当 x >= 10  f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + -- + a9 * f(x-10) 同时ai(0<=i<=9) 不是 0 就是 1: 现在给你 ai 的数字,以及k和mod,请你算出 f(x)%mod 的结果是多少 思路:线性递推关系是组合计数中常用的一种递推关系,如果直接利用递推式,需要很长的时间才能计算得出,时间无法承受,但是现在我们已知

HDU 5950 - Recursive sequence - [矩阵快速幂加速递推][2016ACM/ICPC亚洲区沈阳站 Problem C]

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5950 Farmer John likes to play mathematics games with his N cows. Recently, they are attracted by recursive sequences. In each turn, the cows would stand in a line, while John writes two positive numbers

uva 10401 Injured Queen Problem(DP)

uva 10401 Injured Queen Problem 题目大意:这是一个变形的N皇后问题,皇后不再是占据一行一列以及斜线,她占据的只是她周围的一圈以及她所在的一列.题目给出一个含有问号,数字和字母的字符串.第i个字符是问号代表皇后在第i列的任意一行,若第i个字符是数字或字母X(1-F)代表皇后在第i列的X行.求满足该字符串的摆放方式的方法一共有几种. 解题思路:从第一列开始往后递推.dp[i][j]表示的是结合j - 1列的摆放方式,将皇后放在(i, j)的位置会有几种情况. #inc

hdu 1207 汉诺塔II (DP+递推)

汉诺塔II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4529    Accepted Submission(s): 2231 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往

hdu 1267 递推

下沙的沙子有几粒? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4326    Accepted Submission(s): 2268 Problem Description 2005年11月份,我们学校参加了ACM/ICPC 亚洲赛区成都站的比赛,在这里,我们获得了历史性的突破,尽管只是一枚铜牌,但获奖那一刻的激动,也许将永远铭刻

hdu 1249 三角形 (递推)

三角形 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4390    Accepted Submission(s): 2957 Problem Description 用N个三角形最多可以把平面分成几个区域? Input 输入数据的第一行是一个正整数T(1<=T<=10000),表示测试数据的数量.然后是T组测试数据,每组测试数据只