HDU 4405(확률 DP)

5527 단어 HDU
제목 링크:  http://acm.hdu.edu.cn/showproblem.php?pid=4405

제목 대의:비행 기.만약 격자 가 비행 점 이 아니라면,주사 위 를 던 져 앞으로 나 아가 라.그렇지 않 으 면 바로 목표 지점 으로 날 아 갈 것 이다.각 칸 은 유일한 비행 출발점 이지 만 유일한 비행 종점 은 아니다.도착 하거나 결승점 을 넘 는 주사위 던 지기 기대 수 를 묻는다.
문제 풀이 방향:
기 대 를 바 라 는 것 은 바로 미 루 는 것 이 아니 라 역 추 해 야 한 다 는 것 을 알려 주 는 문제.
만약 에 추진 하고 있다 면 한 점 i 에 대해 비행 종점 이 라면 세 는 그의 비행 출발점 에 도착 해 야 합 니 다.출발점 이 여러 개 있 고 모든 출발점 의 확률 이 반드시 같 지 않 습 니 다.어떻게 구 하 기 를 바 랍 니까?
역 추진(종점 이 기점 으로 변 함)하면 한 점 i 에 대해 비행 기점 이 라면 매 거 진 비행 종점 을 확보 할 수 있 습 니 다.
즉,dp[v]=dp[i](v 는 i 의 종점),즉 v 점 은 주사 위 를 던 지지 않 아 도 되 고 기 대 는 i 점 의 기대 와 같 으 며 가장 중요 한 것 은 v 가 한 번 밖 에 나타 나 지 않 는 다 는 것 이다.
비행 점 이나 출발점(기점 기대=0)이 라면 주사 위 를 던 지지 않 아 도 되 기 때문에 v 점 을 매 거 할 때 미리 표 시 를 해 야 한다.이렇게 하면 이 점 에 주사 위 를 던 지지 않 아 도 된다.
보통 점 이 라면 i+1~i+6 등 확률 적 인 점 에 대한 기대/6 을 매 거 진 하고 주사 위 를 한 번 더 던 져 기대+1 을 한다.
마지막 으로 ans=dp[0].
 
#include "cstdio"

#include "vector"

#include "cstring"

using namespace std;

vector<int> air[100005];

double dp[100005];

bool vis[100005];

int main()

{

    //freopen("in.txt","r",stdin);

    int n,m,u,v;

    while(scanf("%d%d",&n,&m)!=EOF&&n)

    {

        memset(dp,0,sizeof(dp));

        memset(vis,false,sizeof(vis));

        for(int i=0;i<=n;i++) air[i].clear();

        for(int i=1;i<=m;i++)

        {

            scanf("%d%d",&u,&v);

            air[v].push_back(u);

        }

        for(int i=n;i>=0;i--)

        {

            if(!vis[i]&&i!=n)

            {

                for(int j=i+1;j<=i+6;j++) dp[i]+=dp[j]/6;

                dp[i]+=1;

            }

            for(int j=0;j<air[i].size();j++)

            {

                int to=air[i][j];

                dp[to]=dp[i];

                vis[to]=true;

            }

        }

        printf("%.4lf
",dp[0]); } }

 
12186624
2014-11-14 21:25:00
Accepted
4405
15MS
2720K
920 B
C++
Physcal

좋은 웹페이지 즐겨찾기