令人愉快的单词(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’。

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

 #include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char s[];
long long dp[][][];
bool ISyuan(char c)
{return c=='A'||c=='E'||c=='I'||c=='O'||c=='U';} int main()
{
freopen("dobra.in","r",stdin);
freopen("dobra.out","w",stdout);
scanf("%s",s+);
s[]='';
int len=strlen(s)-,tot=;
for(int i=;i<=len;i++)
{
if(s[i]=='_'){
tot++;
}
else{
if(s[i-]<='Z'&&s[i-]>='A')
if(s[i+]<='Z'&&s[i+]>='A')
if(ISyuan(s[i-])==ISyuan(s[i])&&ISyuan(s[i])==ISyuan(s[i+])){
printf("0\n");
return ;
}
}
}
long long total=;
for(;tot--;)total*=26ll; if(ISyuan(s[])){
dp[][][]=1ll;
}
else{
if(s[]=='L')
dp[][][]=1ll;
else if(s[]!='_')
dp[][][]=1ll;
else{
dp[][][]=;
dp[][][]=;
dp[][][]=;
}
} for(int i=;i<=len;i++)
{
if(s[i]=='_'){
dp[i][][]=dp[i-][][]*25ll;
dp[i][][]=dp[i-][][]+dp[i-][][]*26ll; dp[i][][]+=dp[i-][][]*20ll;
dp[i][][]+=dp[i-][][]*21ll+dp[i-][][];
dp[i][][]+=dp[i-][][]*5ll;
dp[i][][]+=dp[i-][][]*5ll; dp[i][][]=dp[i-][][]*20ll+dp[i-][][]*20ll;
dp[i][][]=(dp[i-][][]+dp[i-][][])*21ll+dp[i-][][]+dp[i-][][]; dp[i][][]=dp[i-][][]*20ll;
dp[i][][]=dp[i-][][]*21ll+dp[i-][][]; dp[i][][]=dp[i-][][]*5ll+dp[i-][][]*5ll;
dp[i][][]=dp[i-][][]*5ll+dp[i-][][]*5ll; dp[i][][]=dp[i-][][]*5ll;
dp[i][][]=dp[i-][][]*5ll;
} else{
if(ISyuan(s[i])){
dp[i][][]=dp[i][][]=dp[i][][]=dp[i][][]=0ll; dp[i][][]=dp[i-][][]+dp[i-][][];
dp[i][][]=dp[i-][][]+dp[i-][][]; dp[i][][]=dp[i-][][];
dp[i][][]=dp[i-][][]; dp[i][][]=dp[i-][][]+dp[i-][][];
dp[i][][]=dp[i-][][]+dp[i-][][];
}
else{
dp[i][][]=dp[i][][]=dp[i][][]=dp[i][][]=0ll;
if(s[i]=='L'){
dp[i][][]=dp[i][][]=dp[i][][]=dp[i][][]=dp[i][][]=0ll; dp[i][][]=dp[i-][][]+dp[i-][][]+dp[i-][][]+dp[i-][][];
dp[i][][]=dp[i-][][]+dp[i-][][]; dp[i][][]=dp[i-][][]+dp[i-][][];
dp[i][][]+=dp[i-][][]+dp[i-][][];
}
else{
dp[i][][]=dp[i-][][]+dp[i-][][];
dp[i][][]=dp[i-][][]+dp[i-][][]; dp[i][][]=dp[i-][][]+dp[i-][][];
dp[i][][]=dp[i-][][]+dp[i-][][]; dp[i][][]=dp[i-][][];
dp[i][][]=dp[i-][][];
}
}
}
}
long long off=dp[len][][]+dp[len][][]+dp[len][][]+dp[len][][]+dp[len][][]+dp[len][][];
printf("%lld\n",total-off);
return ;
}

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

动态规划 计数型DP:dobra的更多相关文章

  1. 「bzoj1925」「Sdoi2010」地精部落 (计数型dp)

    「bzoj1925」「Sdoi2010」地精部落---------------------------------------------------------------------------- ...

  2. 动态规划——区间DP,计数类DP,数位统计DP

    本博客部分内容参考:<算法竞赛进阶指南> 一.区间DP 划重点: 以前所学过的线性DP一般从初始状态开始,沿着阶段的扩张向某个方向递推,直至计算出目标状态. 区间DP也属于线性DP的一种, ...

  3. 区间型DP

    区间型DP是一类经典的动态规划问题,主要特征是可以先将大区间拆分成小区间求解最后由小区间的解得到大区间的解. 有三道例题 一.石子合并 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆. ...

  4. POJ3659 Cell Phone Network(树上最小支配集:树型DP)

    题目求一棵树的最小支配数. 支配集,即把图的点分成两个集合,所有非支配集内的点都和支配集内的某一点相邻. 听说即使是二分图,最小支配集的求解也是还没多项式算法的.而树上求最小支配集树型DP就OK了. ...

  5. POJ_1088 滑雪(记忆型DP+DFS)

    Description Michael喜欢滑雪,这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道 ...

  6. UVA12186--树型DP

    树型DP第一题...就是从boss到底层员工是一个树型结构,底层员工想加薪,如果每个boss都有超过T%的员工要求加薪,他就会往更高的bOSs传达,问如果让根节点的大boss接到加薪要求,最少要有多少 ...

  7. POJ 3342 - Party at Hali-Bula 树型DP+最优解唯一性判断

    好久没写树型dp了...以前都是先找到叶子节点.用队列维护来做的...这次学着vector动态数组+DFS回朔的方法..感觉思路更加的清晰... 关于题目的第一问...能邀请到的最多人数..so ea ...

  8. 51 nod 1610 路径计数(Moblus+dp)

    1610 路径计数 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题   路径上所有边权的最大公约数定义为一条路径的值. 给定一个有向无环图.T次修改操作,每次修改一 ...

  9. 【XSY1905】【XSY2761】新访问计划 二分 树型DP

    题目描述 给你一棵树,你要从\(1\)号点出发,经过这棵树的每条边至少一次,最后回到\(1\)号点,经过一条边要花费\(w_i\)的时间. 你还可以乘车,从一个点取另一个点,需要花费\(c\)的时间. ...

随机推荐

  1. python字符串跟整型互转

    print ("整型:",int(50))a=int(50)print("整型:",a)numStr = "50";print (" ...

  2. 布局重用 include merge ViewStub

    在布局优化中,Androi的官方提到了这三种布局<include />.<merge />.<ViewStub />,并介绍了这三种布局各有的优势,下面也是简单说一 ...

  3. 用Javascript进行HTML转义(分享)

      众所周知页面上的字符内容通常都需要进行HTML转义才能正确显示,尤其对于Input,Textarea提交的内容,更是要进行转义以防止javascript注入攻击.   通常的HTML转义主要是针对 ...

  4. 玩转CSLA.NET小技巧系列二:使用WCF无法上传附件,提示413 Entity Too Large

    背景:由于系统需要展示图片,客户上传图片到本地客户端目录,然后在数据库中存储本地图片地址,和图片二进制数据 错误原因:我是使用CSLA的WCF服务,使用了数据门户,WCF协议使用的是wsHttpBin ...

  5. 层模型--绝对定位(position:absolute)

    如果想为元素设置层模型中的绝对定位,需要设置position:absolute(表示绝对定位),这条语句的作用将元素从文档流中拖出来,然后使用left.right.top.bottom属性相对于其最接 ...

  6. Notification和KVO有什么不同

    Notification是推送通知,我们可以建立一个通知中心,存放创建多个通知,在不同的地方在需要的时候push调用和KVO不同的是,KVO是键值观察,只能观察一个值,这就是区别

  7. 不用Google Adsense的84个赚钱方法

    这是一个关于网络广告商和网络销售的汇总列表,可以用来为您的网站或博客赚点钱.广告商都是英文的,加入广告请确认其是否支持中国地区支持,不支持的话就不必加入了. Chitika : 购物中心旗帜广告. ( ...

  8. ZendStudio快捷键

    Ctrl+1 快速修复(最经典的快捷键,就不用多说了)Ctrl+D: 删除当前行Ctrl+Alt+↓ 复制当前行到下一行(复制增加)Ctrl+Alt+↑ 复制当前行到上一行(复制增加)Alt+↓ 当前 ...

  9. SGU 111.Very simple problem

    题目大意:              求平方不大于n(n<=10^1000)的最大的数. 分析:              二分+高精度乘法 或者 高精度开方...               ...

  10. phpcms源码解析(2)

    1.程序启动逻辑: 首先由文件\index.php调用create_app(),此函数在文件\phpcms\base.php中,它完成初始化应用程序,调用函数load_sys_class并提供参数ap ...