非常好的一个题目,CF上的DP都比较经典

题意就是 给定一个串A,B,正好执行K次操作,每次操作可以把 A串从中间切开,并调换两部分的位置,问最后得到B串共有多少种不同的切法(只要中间有一次不同,即视为不同)

首先,题目的一个关键点一定要抓到,就是 ,不管怎么切 然后调换位置,其实串根本没变,你把串想成一个环,从某一点分成两部分并且交换位置,其实就是把串的起点变到了该点,这是很关键也是最机智的一点

然后,我们要发现规律,你纸上模拟也行,推理也行。。

我们发现:1.首先原串(即以0号字母开头的)个数为1,其他种类串为0。

2.第一次变化之后,原串个数即为0,其他串个数为1(由原串变过去,但原串变不成自己)

3.第二次变化,原串个数为len-1(由其他串变过来),其他串变为len-2 (由原串 和 除自己外的其他串变过来, 0+len-2,原串为0,故为len-2)

所以我们总结出的规律,假设 dp[i][0]为原串,dp[i][1]为其他串

dp[i][0]=(len-1)*dp[i-1][1],

dp[i][0]=dp[i-1][0]+(len-2)*dp[i-1][1].

即由上一次的原串 和 其他串的个数,可推得现在的原串和其他串的个数,所以dp的第一维也只要开2就行,用滚动数组

最后枚举一下,B串跟A串 有多少种原串和其他串(其实就是枚举开始的点) 乘以对应的dp即可

真的是巨经典的一个相当于计数dp的题目

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #define LL __int64
  6. using namespace std;
  7. const LL M=1000000000+7;
  8. LL dp[2][2];
  9. char s1[1010],s2[1010];
  10. int k;
  11. int main()
  12. {
  13. while (scanf("%s%s%d",s1,s2,&k)!=EOF)
  14. {
  15. int len=strlen(s1);
  16. dp[0][0]=1;
  17. dp[0][1]=dp[1][1]=dp[1][0]=0;
  18. int p=0;
  19. while (k--)
  20. {
  21. dp[p^1][0]=(len-1)*dp[p][1];
  22. dp[p^1][1]=dp[p][0]+dp[p][1]*(len-2);
  23. p^=1;
  24. if (dp[p][0]>=M) dp[p][0]%=M;
  25. if (dp[p][1]>=M) dp[p][1]%=M;
  26. }
  27. LL ans=0;
  28. for (int i=0;i<len;i++){
  29. bool flag=1;
  30. for(int j=0;j<len;j++){
  31. int q=i+j;
  32. q%=len;
  33. if (s1[q]!=s2[j]){
  34. flag=0;
  35. break;
  36. }
  37. }
  38. if (flag){
  39. if (i==0) ans+=dp[p][0];
  40. else ans+=dp[p][1];
  41. if (ans>=M) ans%=M;
  42. }
  43. }
  44. printf("%I64d\n",ans);
  45. }
  46. return 0;
  47. }

  

Codeforces 176B 经典DP的更多相关文章

  1. Codeforces 176B (线性DP+字符串)

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...

  2. CodeForces 176B Word Cut (计数DP)

    Word Cut Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit St ...

  3. HDU 1003 Max Sum --- 经典DP

    HDU 1003    相关链接   HDU 1231题解 题目大意:给定序列个数n及n个数,求该序列的最大连续子序列的和,要求输出最大连续子序列的和以及子序列的首位位置 解题思路:经典DP,可以定义 ...

  4. poj1458 求最长公共子序列 经典DP

    Common Subsequence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 45763   Accepted: 18 ...

  5. NYOJ - 矩形嵌套(经典dp)

    矩形嵌套时间限制:3000 ms | 内存限制:65535 KB 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b< ...

  6. 51nod 1412 AVL树的种类(经典dp)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1412 题意: 思路: 经典dp!!!可惜我想不到!! $dp[i][k] ...

  7. NYOJ 16 矩形嵌套(经典DP)

    http://acm.nyist.net/JudgeOnline/problem.php?pid=16 矩形嵌套 时间限制:3000 ms  |           内存限制:65535 KB 难度: ...

  8. poj 1050 To the Max 最大子矩阵和 经典dp

    To the Max   Description Given a two-dimensional array of positive and negative integers, a sub-rect ...

  9. CS Academy Distinct Neighbours(经典dp)

    CS Academy Distinct Neighbours(经典dp) 题意: 求相邻无相同数字的合法的排列数 题解: 题解 先将相同的数字分为一类,假设共有n组 定义\(dp[i][j]\)表示前 ...

随机推荐

  1. SparkSQL 疫情Demo练习

    在家闲着没事干, 写个简单的疫情数据处理Demo, 顺便回顾下SparkSQL. 模拟数据(以下数据皆为虚构, 如有雷同不胜荣幸) 市民信息(civic_info.csv) id_no,name,se ...

  2. HTML<video></video>视频无法自动播放

    1.video 标签属性 src: 设置显示视频路径 controls: 显示控制栏 loop: 控制视频循环播放 autoplay: 自动播放 muted:设置静音播放 2.解决视频或音频标签自动播 ...

  3. js 字符串 常用处理方式(检索、截取、拼接、批量替换)

    // 检索(字符串中判断是否包含某个字符) 字符串.search('检索的内容');// 返回-1,不包含: 返回非-1,包含 字符串.indexOf("待判断的内容"); // ...

  4. KDE Plasma 5.17 即将发布

    导读 Plasma 5.17上个月达到了beta版本,而下周将发布Plasma 5.17.0版本!KDE桌面的大更新只有几天了.因此,开发人员一直在整理它,同时也集思广益讨论Plasma 5.18应该 ...

  5. 在vnware中配置好redis后,不能使用图形化工具打开

    1.先检查防火墙的状态 通过systemctl status firewalld查看firewalld状态,发现当前是dead状态,即防火墙未开启 通过systemctl start firewall ...

  6. 黑客的探路狗ReconDog网站信息探测收集工具

    工具下载地址:http://pan.baidu.com/s/1pLJnBLL 密码:gqlz   OR  https://github.com/UltimateHackers/ReconDog 下载并 ...

  7. MQTT 协议学习:002- 通信报文的构成

    背景 之前工作中参与有关协议调试的时候,发现对于协议帧的解析是比较重要的. 参考:<MQTT协议 -- 消息报文格式>.<基于STM32实现MQTT>.<MQTT协议从服 ...

  8. P1069 微博转发抽奖

    P1069 微博转发抽奖 转跳点:

  9. Java8 使用LocalDate计算两个日期间隔多少年,多少月,多少天

    最近项目遇到一个需要计算两个日期间隔的期限,需要计算出,整年整月整日这样符合日常习惯的说法,利用之前的Date和Calendar类会有点复杂,刚好项目使用了JDK8,那就利用起来这个新特性,上代码: ...

  10. 如何使用linux查看tomcat日志