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;
}
原文:https://www.cnblogs.com/Idi0t-N3/p/14726677.html