URAL 1225 Flags (DP动态规划)

#include <stdio.h>
#define MAX_STRIPES 45
#define COLORS 3
#define RED 0
#define WHITE 1
#define BLUE 3
 
int numOfStripes;
/* 
 * 对下标从0到(numOfStripes- 1)的条纹依次进行染色
 * 当把第tail个条纹(也就是当前为止已经上色的最后一个条纹)染成颜色为color时,waysOfTailColor[tail][color]表示从0到tail这些条纹的染色方案的数量
 * 因为末端条纹颜色只能是红色或者白色,所以只能有waysOfTailColor[tail][RED]和waysOfTailColor[tail][WHITE]两种可能
 */
long long waysOfTailColor[MAX_STRIPES][COLORS - 1];//注意数据规模在2^45 -3^45之间,得用long long


int main(){

	scanf("%d", &numOfStripes);
	waysOfTailColor[0][RED] = waysOfTailColor[0][WHITE] = 1;
	waysOfTailColor[1][RED] = waysOfTailColor[1][WHITE] = 1;
	
	int tail;
	for (tail = 1; tail < numOfStripes; tail++){
		/* 
		 * 当把末端条纹染成红色时,倒数第二个条纹的颜色只能是白色,或者蓝色
		 * 所以waysOfTailColor[tail][RED] = waysOfTailColor[tail - 1][WHITE] + waysOfTailColor[tail - 1][BULE];
		 * 又因为如果倒数第二个条纹为蓝色,倒数第三个条纹只能是白色
		 * 所以waysOfTailColor[tail - 1][BULE] = waysOfTailColor[tail - 2][WHITE]
		 * 所以waysOfTailColor[tail][RED] = waysOfTailColor[tail - 1][WHITE] + waysOfTailColor[tail - 2][WHITE]
		 * waysOfTailColor[tail][WHITE]跟waysOfTailColor[tail][RED]同理
		 */
		waysOfTailColor[tail][RED] = waysOfTailColor[tail - 1][WHITE] + waysOfTailColor[tail - 2][WHITE];
		waysOfTailColor[tail][WHITE] = waysOfTailColor[tail - 1][RED] + waysOfTailColor[tail - 2][RED];
	}

	int waysOfColor = waysOfTailColor[numOfStripes - 1][RED] + waysOfTailColor[numOfStripes - 1][WHITE];
	//注意long long的输出格式
	printf("%I64d\n", waysOfColor);

	return 0;
}

你可能感兴趣的:(dp,动态规划,flags,1225,ural)