最近刚学了数学期望DP,还是蛮恶心的,但是相比于其他DP还是比较好想的,主要思路和线性DP类似,主要注意的是概率计算利用加法原理加和的方式,还要注意避免数组下标为负的情况,需要进行平移。
- Tyvj1864 守卫者的挑战
比较简单的一道数学概率DP,要注意负数组下标。
f[i][j][k] 表示 前i场 赢了j场 容量-地图为k的概率
然后状态转移是 :如果 赢了,i+1,j+1,k进行相应变化
输了,i+1, j不变,k不变
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=200+10;
int n,t,l;
double p[maxn];
int a[maxn];
double f[maxn][maxn][maxn+200]; // f[i][j][k]代表 前i场 赢了j场 容量-地图为k的概率
int main(){
scanf("%d%d%d",&n,&l,&t);
for(int i=1;i<=n;i++){
scanf("%lf",&p[i]);
p[i]/=100;
}
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
if(t>n)t=n;
f[0][0][t+200]=