zoukankan      html  css  js  c++  java
  • 概率长度hdu 3689 Infinite monkey theorem dp

    时间紧张,先记一笔,后续优化与完善。

        dp[i][j] 表现长度为i的时候匹配到单词的第j位,并且没有现出过该单词的概率。

        f[i][j] 表现匹配到第i位时参加‘a'+j时会匹配到哪一位。

        

        先暴力出f[i][j]。然后转移就非常简答了。

        

        

        #include <iostream>

        每日一道理
    感叹人生,是因为曾经没有过轰轰烈烈的壮举,觉得渺小,觉得平庸,似乎生活过于简单,简单得让人感觉烦躁。没有大言不惭地说过将来,只是比较现实地握住了现在,我想,这是一条路,每个人所必须踏上的一次旅程,曾经看到过这样一句话:成长的过程漫长却充实,自毁的过程短暂却留下一生痛苦,人生可以说是一次考验,何去何从取决于自我。

        #include <cstdio>
    #include <cstring>
    using namespace std;
    int n,m;
    double a[1001];
    char t[101];
    double dp[1011][14];
    int f[101][101];


    int check(int r,int s)
    {
        for(int i=s,j=0;i>=1;i--,j++)
        {
    //        printf("%d %d\n",i,r-j);
            if(t[i]!=t[r-j])
            return(0);
        }
        return(1);
    }


    int work(int r,int s)
    {
        for(int j=r+1;j>=1;j--)
        if(t[j]==s+'a')
        {
            if(check(r,j-1))
            return(j);
        }
        return(0);
    }


    int main()
    {
    //    freopen("in.txt","r",stdin);
        while(scanf("%d %d",&n,&m),n||m)
        {
            memset(a,0,sizeof(a));
            for(int i=1;i<=n;i++)
            {
                getchar();
                char tmp;
                scanf("%c",&tmp);
                scanf("%lf",&a[tmp]);
            }
            scanf("%s",&t[1]);


            int lon=strlen(&t[1]);


    //        printf("%s",&t[1]);


    //          f[2]['o'-'a']=work(2,'o'-'a');


            for(int i=0;i<lon;i++)
            for(int j=0;j<26;j++)
            {
                f[i][j]=work(i,j);
            }


    //        printf("%d\n",f[2]['o'-'a']);


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


            dp[0][0]=1;


            for(int k=0;k<m;k++)
            for(int i=0;i<lon;i++)
            for(int j=0;j<26;j++)
            {
                dp[k+1][f[i][j]]+=dp[k][i]*a[j+'a'];
            }


    //        for(int k=0;k<m;k++)
    //        for(int i=0;i<lon;i++)
    //        printf("%d %d %lf\n",k,i,dp[k][i]);


            double ans=0;


            for(int i=0;i<lon;i++)
            ans+=dp[m][i];


            printf("%.2f",100-ans*100);
            printf("%c\n",'%');
        }
        return 0;
    }

    文章结束给大家分享下程序员的一些笑话语录: 人在天涯钻,哪儿能不挨砖?日啖板砖三百颗,不辞长做天涯人~

  • 相关阅读:
    使用Bootstrap后,关于IE与Chrome显示字体的问题
    利用百度接口,识别身份证
    双日历日期选择控件
    回复一个朋友:如何理解委托
    IIS7增加mine类型,以便可以访问apk
    关于SqlBulkCopy SQL批量导入需要注意,列名是区分大小写的
    关于取表中id最大值+1的select语句,哪种效率更高?
    MySQL中如何分析查询语句
    判断同名股票是否存在的MyBatis查询函数写法
    Thymeleaf中model设一个值 页面显示此值 JS取此值
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3049898.html
Copyright © 2011-2022 走看看