ZOJ 3735 Josephina and RPG (概率DP)
2015-07-16 16:29
357 查看
题意:有r个角色,i角色打败j角色的概率为p[i][j].游戏有n轮,每轮都会有一个角色与你对战,游戏开始你可以选择一个角色进行游戏,每轮结束后如果你胜出,可以进行下一轮,并且可以把自己使用的角色更换为刚打败的角色,求通关的最大胜率。
思路:设dp[i][j]为在第i轮用j角色通关的最大概率
状态转移方程:
dp[i][j] = p[j][a[i]] * max(dp[i+1][j],dp[i+1][a[i]]).
我的代码:
思路:设dp[i][j]为在第i轮用j角色通关的最大概率
状态转移方程:
dp[i][j] = p[j][a[i]] * max(dp[i+1][j],dp[i+1][a[i]]).
我的代码:
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; const int maxn = 10005; int m,n,r,a[maxn]; double p[150][150],dp[maxn][150]; int main(){ while(scanf("%d",&m)!=EOF){ r = m * (m - 1) * (m - 2) / 6; for(int i = 0 ;i < r ; i++){ for(int j = 0 ; j < r ; j++) scanf("%lf",&p[i][j]); } scanf("%d",&n); for(int i = 0 ; i < n ; i++) scanf("%d",&a[i]); for(int i = 0 ;i < n ; i++) for(int j = 0 ;j < r ; j++) dp[i][j] = 0; for(int j = 0 ; j < r ; j++) dp[n-1][j] = p[j][a[n-1]]; for(int i = n - 2 ; i >= 0 ; i--){ for(int j = 0 ; j < r ; j++){ dp[i][j] = max(dp[i][j],p[j][a[i]]*max(dp[i+1][j],dp[i+1][a[i]])); } } double res = 0; for(int j = 0 ; j < r ; j++) res = max(res,dp[0][j]); printf("%.6lf\n",res); } return 0; }
相关文章推荐
- Java内存模型
- 算法的封装与切换——策略模式(二)
- 哇!!!找了好久Java的课程
- ,gitignore 中规则不起作用的原因
- Hadoop学习之自定义二次排序
- opengl实现直线扫描算法和区域填充算法
- 安卓的蓝牙开发
- android dp与px之间转换以及px与sp之间的转换
- mysql集群安装配置
- Xcode连接git@osc
- Xcode连接git@osc
- 《JavaScript设计模式与开发实践》读书笔记之代理模式
- Mediaplayer
- IOS-CGAffineTransformMake 矩阵变换 的运算原理
- TP中单字母快捷函数总结
- android 设备在设置节能模式的情况下 调用 Toast 会 唤醒屏幕 突然变亮
- 找出oracle没有创建索引的外键
- quartz持久化
- cocos2d-x初探学习笔记(18)--Lable
- cocos2d-x初探学习笔记(17)--瓦片地图集