题目描述:
粉刷墙面,要求每行每列至少有一块瓷砖被粉刷
每次会选择任意一格粉刷,粉刷完之后会休息一分钟
求粉刷完整面墙的时间期望
分析:
设
f[i][j]
f
[
i
]
[
j
]
表示还剩
i
i
行列才能粉刷完的期望
那么
f[i][j]
f
[
i
]
[
j
]
有四种转移方向啊:
f[i][j]<−(f[i][j]+1)∗in∗jn
f
[
i
]
[
j
]
<
−
(
f
[
i
]
[
j
]
+
1
)
∗
i
n
∗
j
n
f[i][j]<−(f[i+1][j]+1)∗n−in∗jn
f
[
i
]
[
j
]
<
−
(
f
[
i
+
1
]
[
j
]
+
1
)
∗
n
−
i
n
∗
j
n
f[i][j]<−(f[i][j+1]+1)∗in∗n−jn
f
[
i
]
[
j
]
<
−
(
f
[
i
]
[
j
+
1
]
+
1
)
∗
i
n
∗
n
−
j
n
f[i][j]<−(f[i+1][j+1]+1)∗n−in∗n−jn
f
[
i
]
[
j
]
<
−
(
f
[
i
+
1
]
[
j
+
1
]
+
1
)
∗
n
−
i
n
∗
n
−
j
n
f[i][j]=(f[i][j]+1)∗in∗jn+(f[i+1][j]+1)∗n−in∗jn+(f[i][j+1]+1)∗in∗n−jn+(f[i+1][j+1]+1)∗n−in∗n−jn f [ i ] [ j ] = ( f [ i ] [ j ] + 1 ) ∗ i n ∗ j n + ( f [ i + 1 ] [ j ] + 1 ) ∗ n − i n ∗ j n + ( f [ i ] [ j + 1 ] + 1 ) ∗ i n ∗ n − j n + ( f [ i + 1 ] [ j + 1 ] + 1 ) ∗ n − i n ∗ n − j n
(1−ijn2)f[i][j]=ijn2+(f[i+1][j]+1)∗(n−i)jn2+(f[i][j+1]+1)∗i(n−j)n2+(f[i+1][j+1]+1)∗(n−i)(n−j)n2 ( 1 − i j n 2 ) f [ i ] [ j ] = i j n 2 + ( f [ i + 1 ] [ j ] + 1 ) ∗ ( n − i ) j n 2 + ( f [ i ] [ j + 1 ] + 1 ) ∗ i ( n − j ) n 2 + ( f [ i + 1 ] [ j + 1 ] + 1 ) ∗ ( n − i ) ( n − j ) n 2
f[i][j]=ijn2+(f[i+1][j]+1)∗(n−i)jn2+(f[i][j+1]+1)∗i(n−j)n2+(f[i+1][j+1]+1)∗(n−i)(n−j)n21−ijn2 f [ i ] [ j ] = i j n 2 + ( f [ i + 1 ] [ j ] + 1 ) ∗ ( n − i ) j n 2 + ( f [ i ] [ j + 1 ] + 1 ) ∗ i ( n − j ) n 2 + ( f [ i + 1 ] [ j + 1 ] + 1 ) ∗ ( n − i ) ( n − j ) n 2 1 − i j n 2
tip
我一开始是正推(0~n),但是跑不出答案
于是变成倒推就好了
看来有时候转移也要正难则反
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int N=2005;
int n,m,hcnt=0,zcnt=0;
bool h[N],z[N];
double f[N][N];
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++) {
int r,c;
scanf("%d%d",&r,&c);
if (!h[r]) h[r]=1,hcnt++;
if (!z[c]) z[c]=1,zcnt++;
}
f[n][n]=0;
for (int i=n;i>=0;i--)
for (int j=n;j>=0;j--) {
if (i==n&&j==n) continue;
double p1=(double)i/(double)n;
double p2=(double)j/(double)n;
double p3=1.0-p1;
double p4=1.0-p2;
f[i][j]+=p1*p2;
f[i][j]+=(f[i+1][j]+1.0)*p3*p2;
f[i][j]+=(f[i][j+1]+1.0)*p1*p4;
f[i][j]+=(f[i+1][j+1]+1.0)*p3*p4;
f[i][j]/=(1-p1*p2);
}
printf("%0.10lf",f[hcnt][zcnt]);
}