100가지 동적 계획 – 33 HDU 5602 Black Jack 게임 DP?이런 스타일은 안 해봤어요.

바둑 이론 문제를 풀었고, 확률 DP 문제를 풀었지만, 이런 문제를 본 적이 없다.
두 개의 그룹을 열어 기억화 검색을 진행해야 합니다.
사실 일부 원인도 제목이 명확하게 묘사되지 않았기 때문이다(오,사실은 자신이 크기를 정확하게 보지 못한 규칙이다)
규칙은 우선 한가한 사람이 패를 부르고, 끊임없이 패를 부르고, 그 다음에 농가가 패를 부르고, 끊임없이 패를 부르고, 농가가 패를 부르지 않을 때, 크기를 비교하는 것이다.
텔레비전에서 봤던 그런 농사꾼들이 왔다갔다 번갈아 가며 카드를 부르는 게 아니라...
규칙을 정확하게 이해하는 상황에서 전체는 두 라운드밖에 없다. 하나는 한가한 사람이 카드를 부르는 것이다. 한가한 사람은 자신의 승률이 가장 높고 농가가 카드를 부를 차례가 되면 농가는 한가한 사람의 승률을 가장 낮게 한다.
정의 상태 dp[0][i][j]는 한가 i점, 농가 j점을 나타낸다. 이때는 한가 조작의 한가 승률이다.
dp[1][i][j]는 한가 i점, 농가 j점을 나타낸다. 이때는 농가가 조작하는 농가의 승률이다.
상태 이동 방정식은 코드 안에서 보세요. 주의해야 할 것은 농가가 조작할 때 농가가 카드를 부르지 않으면 크기를 비교하는 부분에 들어갑니다.
바둑 DP, 사실 자세하게 분석하면, 변화도 그리 크지 않고, 단지 방법을 바꾸었을 뿐이다
#include 
#include 
#include 
#include 
#include 

using namespace std;
const int maxm=35;

inline int p(char c){return (c=='A')?1:((isdigit(c)?c-'0':10));}
bool vis[2][maxm][maxm];
double dp[2][maxm][maxm],dfs0(int a,int b),dfs1(int a,int b);
int times;
string str;

int main(){
    ios_base::sync_with_stdio(false);
    cin>>times;
    while(times--){
        cin>>str;
        cout<0.5?"YES
":"NO
"); } return 0; } double dfs0(int a, int b){ if(a>21) return 0; else if(vis[0][a][b]) return dp[0][a][b]; vis[0][a][b]=true; dp[0][a][b]=dfs1(a,b); double tmp=0; for(int i=1;i<10;++i) tmp+=dfs0(a+i,b)/13; tmp+=dfs0(a+10,b)*4/13; return dp[0][a][b]=max(dp[0][a][b],tmp); } double dfs1(int a,int b){ if(b>21) return 1; else if(vis[1][a][b]) return dp[1][a][b]; vis[1][a][b]=true; dp[1][a][b]=a>b; double tmp=0; for(int i=1;i<10;++i) tmp+=dfs1(a,b+i)/13; tmp+=dfs1(a,b+10)*4/13; return dp[1][a][b]=min(tmp,dp[1][a][b]); }

좋은 웹페이지 즐겨찾기