程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu4800_Josephina and RPG(二維狀態dp)

hdu4800_Josephina and RPG(二維狀態dp)

編輯:C++入門知識

hdu4800_Josephina and RPG(二維狀態dp)



 

 題解:dp的狀態設為,使用角色 j 去通過第 i 關的最大勝率(dp[i][j] )

從最後一場開始算:
dp[i][j] = rate[j][ AI[i] ] * max( dp[i+1][j] ,dp[i+1][a[i]);

即:使用角色 j 去通過第 i 關的最大勝率 = 使用角色 j 打贏第 i 關AI的勝率 * max(下一關用 j 通關的概率 , 下一關換用本關AI通過的概率)

設好初值,歷遍即可。

#include
#include
#include
#include
#include
#include
#include
#include
#include 
#include
#include
#include 
#include
#include
#include 
#include
#include
using namespace std;
#define mem(x,y) memset(x,y,sizeof(x))
inline int lowbit(int x){ return x&(-x);}
typedef  long long int LL;
const int INF = 0x3f3f3f3f ;
const long double PI = acos(0.0) * 2.0;
const int N = 10000+10;
const double eps = 1e-6;
double dp[N][200],rate[200][200];
int ai[N];

int Comb(int x , int y);
int main()
{
    int n,m;
    //ios::sync_with_stdio(false);//關閉同步流
    while(scanf(%d,&m) == 1)
    {
        int r = Comb(m,3);

        for(int i = 0 ; i < r ; i++)
            for(int  j = 0 ; j < r ; j++)
                scanf(%lf,&rate[i][j]);

        scanf(%d,&n);
        for(int i = 0 ; i < n ; i++)
            scanf(%d,&ai[i]);

        mem(dp,0.0);

        for(int j = 0 ; j < r ; j++)
            dp[n-1][j] = rate[j][ ai[n-1] ];

        for(int i = n-2 ; i >= 0; i--)
        {
            for(int j = 0 ; j < r ; j++)
            {
                dp[i][j] = max(dp[i][j],rate[j][ ai[i] ] * max( dp[i+1][j],dp[i+1][ ai[i] ] ));

            }
        }

        double res = 0.0;
        for(int j = 0 ; j < r ; j++)
            res = max(res,dp[0][j]);

        printf(%.6lf
,res);
    }
    return 0;
}

int Comb(int x , int y)
{
    int u=1,v=1,len;
    if(y==0||x==y) return 1;
    if(y==1)  return x;
    if(x < y ) return 0;

    if(y > x/2) y = len = x-y;
    else len = y;

    while(len--)
    {
        u*= x--;
        v*= y--;
    }
    return  (int)(u/v);
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved