zoukankan      html  css  js  c++  java
  • 动态规划 计数型DP:dobra

    令人愉快的单词(dobra)
    时间限制: 0.1 秒
    空间限制: 32 MB 【问题描述】
    Lea 在她的一生中碰到过很多单词。其中的很大一部分都使她不愉快。作为
    补偿,她开始创造一些愉快的单词。 Lea 通过写下一些看起来很不错的字母在一
    张纸上来创造新单词。接下来,她擦掉一些看起来最令人讨厌的字母,并用'_'
    来代替它们。接下来,她想要用更令人接受的字母替换掉这些下划线来构成一个
    令人愉快的单词。
    Lea 认为一个单词是愉快的当且仅当这个单词不包括 3 个连续的元音,不包
    括 3 个连续的辅音并且包括至少一个'L'。
    在克罗地亚文中,属于元音的字母只有 A, E, I, O, U。其它的都是辅音。 【输入文件】
    输入文件 dobra.in 只有 1 行,为一个不超过 100 个字符的字符串。这个字符
    串只包括大写的英文字母和'_'。数据保证输入中的'_'不超过 10 个。 【输出文件】
    输出文件 dobra.out 包括一个整数,表示通过替换输入中的下划线可以构成
    多少个令人愉快的单词。
    注意:请使用 64 位整数类型。对于 C/C++语言,请使用 long long,对于 Pascal
    语言,请使用 int64。 【输入输出样例】
    input
    L_V
    input
    V__K
    input
    JA_BU_K_A
    output
    5
    output
    10
    output
    485

    三维数组DP,第一维指枚举到了那位,第二维中 

      下标0指连续有一个辅音并没有出现过三元或三辅的情况数

      下标1指连续有两个辅音并没有出现过三元或三辅的情况数

      下标2指连续有一个元音并没有出现过三元或三辅的情况数

      下标4指连续有两个元音并没有出现过三元或三辅的情况数

    第三维中指是否出现过‘L’。

    看起来复杂其实思路很简单

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstring>
      4 using namespace std;
      5 char s[110];
      6 long long dp[110][7][2];
      7 bool ISyuan(char c)
      8 {return c=='A'||c=='E'||c=='I'||c=='O'||c=='U';}
      9 
     10 int main()
     11 {
     12     freopen("dobra.in","r",stdin);
     13     freopen("dobra.out","w",stdout);
     14     scanf("%s",s+1);
     15     s[0]='1';
     16     int len=strlen(s)-1,tot=0;
     17     for(int i=1;i<=len;i++)
     18     {
     19         if(s[i]=='_'){
     20             tot++;
     21         }
     22         else{
     23             if(s[i-1]<='Z'&&s[i-1]>='A')
     24                 if(s[i+1]<='Z'&&s[i+1]>='A')
     25                     if(ISyuan(s[i-1])==ISyuan(s[i])&&ISyuan(s[i])==ISyuan(s[i+1])){
     26                         printf("0
    ");
     27                         return 0;
     28                     }
     29         }
     30     }
     31     long long total=1;
     32     for(;tot--;)total*=26ll;
     33     
     34     if(ISyuan(s[1])){
     35         dp[1][2][0]=1ll;
     36     }
     37     else{
     38         if(s[1]=='L')
     39             dp[1][0][1]=1ll;
     40         else if(s[1]!='_') 
     41             dp[1][0][0]=1ll;
     42         else{
     43             dp[1][0][0]=20;
     44             dp[1][0][1]=1;
     45             dp[1][2][0]=5;
     46         }        
     47     }
     48     
     49     for(int i=2;i<=len;i++)
     50     {
     51         if(s[i]=='_'){
     52             dp[i][4][0]=dp[i-1][4][0]*25ll;
     53             dp[i][4][1]=dp[i-1][4][0]+dp[i-1][4][1]*26ll;
     54             
     55             dp[i][4][0]+=dp[i-1][1][0]*20ll;
     56             dp[i][4][1]+=dp[i-1][1][1]*21ll+dp[i-1][1][0];
     57             dp[i][4][0]+=dp[i-1][3][0]*5ll;
     58             dp[i][4][1]+=dp[i-1][3][1]*5ll;
     59             
     60             dp[i][0][0]=dp[i-1][2][0]*20ll+dp[i-1][3][0]*20ll;
     61             dp[i][0][1]=(dp[i-1][2][1]+dp[i-1][3][1])*21ll+dp[i-1][2][0]+dp[i-1][3][0];
     62             
     63             dp[i][1][0]=dp[i-1][0][0]*20ll;
     64             dp[i][1][1]=dp[i-1][0][1]*21ll+dp[i-1][0][0];
     65             
     66             dp[i][2][0]=dp[i-1][0][0]*5ll+dp[i-1][1][0]*5ll;
     67             dp[i][2][1]=dp[i-1][0][1]*5ll+dp[i-1][1][1]*5ll;
     68             
     69             dp[i][3][0]=dp[i-1][2][0]*5ll;
     70             dp[i][3][1]=dp[i-1][2][1]*5ll;
     71         }
     72         
     73         else{
     74             if(ISyuan(s[i])){
     75                 dp[i][0][0]=dp[i][0][1]=dp[i][1][0]=dp[i][1][1]=0ll;
     76                 
     77                 dp[i][2][0]=dp[i-1][0][0]+dp[i-1][1][0];
     78                 dp[i][2][1]=dp[i-1][0][1]+dp[i-1][1][1];
     79                 
     80                 dp[i][3][0]=dp[i-1][2][0];
     81                 dp[i][3][1]=dp[i-1][2][1];
     82                 
     83                 dp[i][4][0]=dp[i-1][4][0]+dp[i-1][3][0];
     84                 dp[i][4][1]=dp[i-1][4][1]+dp[i-1][3][1];
     85             }
     86             else{
     87                 dp[i][2][0]=dp[i][2][1]=dp[i][3][0]=dp[i][3][1]=0ll;
     88                 if(s[i]=='L'){
     89                     dp[i][0][0]=dp[i][1][0]=dp[i][2][0]=dp[i][3][0]=dp[i][4][0]=0ll;
     90     
     91                     dp[i][0][1]=dp[i-1][2][0]+dp[i-1][2][1]+dp[i-1][3][0]+dp[i-1][3][1];
     92                     dp[i][1][1]=dp[i-1][0][0]+dp[i-1][0][1];
     93                     
     94                     dp[i][4][1]=dp[i-1][4][0]+dp[i-1][4][1];
     95                     dp[i][4][1]+=dp[i-1][1][0]+dp[i-1][1][1];
     96                 }
     97                 else{
     98                     dp[i][4][0]=dp[i-1][4][0]+dp[i-1][1][0];
     99                     dp[i][4][1]=dp[i-1][4][1]+dp[i-1][1][1];
    100                     
    101                     dp[i][0][0]=dp[i-1][2][0]+dp[i-1][3][0];
    102                     dp[i][0][1]=dp[i-1][2][1]+dp[i-1][3][1];
    103                     
    104                     dp[i][1][0]=dp[i-1][0][0];
    105                     dp[i][1][1]=dp[i-1][0][1];
    106                 }
    107             }
    108         }
    109     }
    110     long long off=dp[len][4][0]+dp[len][4][1]+dp[len][0][0]+dp[len][1][0]+dp[len][2][0]+dp[len][3][0];
    111     printf("%lld
    ",total-off);
    112     return 0;
    113 }

     其实这道题用搜索,只有三类状态,可以AC,代码量只有50行,囧

    尽最大的努力,做最好的自己!
  • 相关阅读:
    [LeetCode] 374. Guess Number Higher or Lower
    [LeetCode] 35. Search Insert Position
    [LeetCode] 205. Isomorphic Strings
    [LeetCode] 87. Scramble String
    [LeetCode] 274. H-Index
    [LeetCode] 507. Perfect Number
    [LeetCode] 88. Merge Sorted Array
    [LeetCode] 283. Move Zeroes
    [LeetCode] 287. Find the Duplicate Number
    [LeetCode] 204. Count Primes
  • 原文地址:https://www.cnblogs.com/TenderRun/p/5175993.html
Copyright © 2011-2022 走看看