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\n");
			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\n", dv[cur][m]);
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章