这道题,我在网上看到两种dp,不过基本原理是一样的,不过感觉还是后面的一种比较巧妙!因为我对动态不是很熟,自能加上一些自己的理解,写上注释。

1)

#include <stdio.h>
#include <string.h>
#include<ctype.h>
char str[];
long long int dp[][]; /*2^63次恰好是longlong int */
int main(void)
{
long long int i,j,len; while(scanf("%s",str) != EOF)
{
memset(dp,,sizeof(dp));
len = strlen(str);
for (i = ;i<len;i++)/*转化为小写字母*/
str[i]=tolower(str[i]); if(str[] == 's')
dp[][] = ; /*dp[j][i] 第i个位置上第j个字母的数量与前面字母交叉匹配的数量;*/
for(i=;i<len;i++)
{
for(j=;j<;j++)/*第i个位置肯不是四个,但是我们要计算个数,那么i个位置无论有没有出现过这个字母都继承前面的 */
dp[j][i]=dp[j][i-];
if(str[i] == 's')/*统计s的数量*/
dp[][i]++;
if(str[i] == 'e')/*每次后面的字母匹配数就加上与之前字母匹配的个数*/
{
dp[][i]+=dp[][i-];
dp[][i]+=dp[][i-];
}
else if(str[i] == 'v')
dp[][i] += dp[][i-];
else if(str[i] == 'n')
dp[][i]+=dp[][i-]; }
printf("%lld\n",dp[][len-]);/*最后一个位置最后一个字母与倒数第二个字母交叉匹配的数量即最后seven隐含的总个数 */
}
return ;
}

2)

#include<stdio.h>
#include<string.h>
#include<ctype.h>
char str[10010];
long long unsigned dp[6];
int main(void)
{
int i,j;
char seven[]=" seven"; while(scanf("%s",str) != EOF)
{
memset(dp,0,sizeof(dp));
dp[0]=1;
for( i=0;str[i];++i)
{
str[i]=tolower(str[i]);
/*dp[j]表示到达seven[j]有多少条路径。如果str[i]和seven[j]相等,
则dp[j]就多出dp[j-1]条路径。类似于01背包,因为str中的每个字符只能取一次,所以要从后往前遍历。
*/
for( j=5;j>0;--j)
if(str[i]==seven[j])
dp[j]=dp[j-1]+dp[j]; /*原理基本和上面代码一样,
都是遇到一个字母就将该字母的匹配数加上前面字母的匹配数
,对seven字母的比较,不过上面的是顺下来,这个倒回去*/
}
printf("%llu\n",dp[5]);
}
return 0;
}

zoj 3171 The Hidden 7's的更多相关文章

  1. ZOJ 3171 The Hidden 7's DP

    传送门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3203 题目大意给定一串字符串,需要计算出seven的个数. #incl ...

  2. zoj 1729 Hidden Password

    Hidden Passwordhttp://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=729 Time Limit: 2 Seconds ...

  3. ZOJ 1729 Hidden Password (字符串最小表示)

    以前听过,不知道是什么,其实就是字符串首尾相连成一个环,n种切法求一个字典序最小的表示. 朴素算法大家都懂.O(n)的算法代码非常简单,最主要的思想是失配的时候尽可能大的移动指针. 另外附上一个不错的 ...

  4. 表单reset无法重置hidden的解决方案

    方法一:用text代替hidden,设置text隐藏 <input id="id" name="id" style="display: none ...

  5. overflow:hidden与margin:0 auto之间的冲突

    相对于父容器水平居中的代码margin:0 auto与overflow:hidden之间存在冲突.当这两个属性同时应用在一个DIV上时,在chrome浏览器中将无法居中.至于为啥我也不明白.

  6. ZOJ People Counting

    第十三届浙江省大学生程序设计竞赛 I 题, 一道模拟题. ZOJ  3944http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=394 ...

  7. ZOJ 3686 A Simple Tree Problem

    A Simple Tree Problem Time Limit: 3 Seconds      Memory Limit: 65536 KB Given a rooted tree, each no ...

  8. 移动端浏览器body的overflow:hidden并没有什么作用

    今天突然遇到一个问题,使用li模拟select,但是碰到一个很尴尬的问题,给body加了overflow:hidden,但是body并没有禁止滚动条,滚动条依旧顺滑. <!DOCTYPE htm ...

  9. display:none与visible:hidden的区别 slideDown与

    display:none与visible:hidden的区别 display:none和visible:hidden都能把网页上某个元素隐藏起来,但两者有区别: display:none ---不为被 ...

随机推荐

  1. 查看EBS R12应用中使用CONTEXT_FILE的版本及路径

    SELECT * FROM APPLSYS.FND_OAM_CONTEXT_FILES;

  2. “error LNK1169: 找到一个或多个多重定义的符号”的解决方法(转载)

    解决方案: “error LNK1169: 找到一个或多个多重定义的符号”的解决方法(转载) 遇到的问题: 在.h头文件中采用namespace 命名空间报错 test.h namespace LMR ...

  3. Linux学习之服务器端口查看的方法

    1.用netstat查看: [grid@rac121 admin]$ netstat -anp | grep oracle (Not all processes could be identified ...

  4. Android 利用剪切板(clipboardManager )实现数据传递

    首先是系统剪切板的调用服务: ClipboardManager ClipboardManager=getSystemService(Context.CLIPBOARD_SERVICE); 然后是写入, ...

  5. Swift 断言

    assert(条件,"输出信息"); 如: let age=-1; assert(age>=0,"age要大于0");

  6. EasyUI在MVC4中需要部分刷新页面时load()后页面变形问题!

    最近在使用MVC4与EasUI过程中遇到些容易导致界面变形的问题,纠结了很久,但其实当发现问题在哪里时,倒觉得最终还是自己对MVC4的概念没把握好,OK,show time.  本示例Contact ...

  7. erlang supervisor说明

    Supervisor Behaviour是一个用来实现一个supervisor进程来监控其他子进程的模块 子进程可以是另一个supervisor,也可以是一个worker进程. worker进程一般使 ...

  8. poj2141---字符串转换

    #include <stdio.h> #include <stdlib.h> int main() { ]; char tmp; scanf("%s",ke ...

  9. poj1656---数黑格子

    题意:有white,black,test操作 black将给定范围涂黑,white将给定范围涂白,test将给定范围的黑格子数出来并且输出 思路:无论哪个操作格子范围都在  (x,y)  (x+L-1 ...

  10. _extend用法总结

    针对对象数组: 后面的属性会覆盖更新前面的属性 看代码: <!DOCTYPE html> <html> <head> <meta charset=" ...