POJ 1322

POJ百题,平平无奇

DP转移非常水,然而这道题判断数据复杂度实在是绞尽脑汁,然而等到看到其他对于这种复杂度解决方法,实在大跌眼镜。

#include <iostream>
#include <algorithm>
#include <queue>
#include <string>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <stack>
#include <map>
#include <set>
#include <deque>
using namespace std;

const int maxn= 1e6+5;
const int maxc= 105;

struct Frac
{
	int nu, de;
	Frac(int _nu= 0, int _de= 0) : nu(_nu), de(_de) {}
};
double dv[2][maxc];
double co_l[maxc], co_r[maxc];

int main(int argc, char const *argv[])
{
	int c, n, m;
	while (~scanf("%d", &c) && c){
		scanf("%d %d", &n, &m);
		if (m> n || m> c || ((m+n)&1)){
			printf("0.000
");
			continue;
		}
		int cur= 0, pre;
		dv[cur][0]= 1;
		for (int i= 1; i<= c; ++i){
			dv[cur][i]= 0;
		}
		for (int i= 1; i<= c; ++i){
			co_l[i]= (c-i+1)/((double)c);
		}
		for (int i= 0; i< c; ++i){
			co_r[i]= (i+1)/((double)c);
		}
		co_l[0]= 0;
		co_r[c]= 0;
		if (n> 1000){
			n= 1000+(n&1);
		}
		for (int i= 1; i<= n; ++i){
			pre= cur;
			cur^= 1;
			for (int j= 0; j<= c; ++j){
				dv[cur][j]= 0;
				if ((i+j) & 1){
					continue;
				}
				if (j> 0){
					dv[cur][j]+= dv[pre][j-1]*co_l[j];
				}
				if (j< c){
					dv[cur][j]+= dv[pre][j+1]*co_r[j];
				}
			}
		}
		printf("%.3lf
", dv[cur][m]);
	}
	return 0;
}
原文地址:https://www.cnblogs.com/Idi0t-N3/p/14726677.html