Codeforces 176B 经典DP
非常好的一个题目,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的题目
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define LL __int64
using namespace std;
const LL M=1000000000+7;
LL dp[2][2];
char s1[1010],s2[1010];
int k;
int main()
{
while (scanf("%s%s%d",s1,s2,&k)!=EOF)
{
int len=strlen(s1);
dp[0][0]=1;
dp[0][1]=dp[1][1]=dp[1][0]=0;
int p=0;
while (k--)
{
dp[p^1][0]=(len-1)*dp[p][1];
dp[p^1][1]=dp[p][0]+dp[p][1]*(len-2);
p^=1;
if (dp[p][0]>=M) dp[p][0]%=M;
if (dp[p][1]>=M) dp[p][1]%=M;
}
LL ans=0;
for (int i=0;i<len;i++){
bool flag=1;
for(int j=0;j<len;j++){
int q=i+j;
q%=len;
if (s1[q]!=s2[j]){
flag=0;
break;
}
}
if (flag){
if (i==0) ans+=dp[p][0];
else ans+=dp[p][1];
if (ans>=M) ans%=M;
}
}
printf("%I64d\n",ans);
}
return 0;
}
Codeforces 176B 经典DP的更多相关文章
- Codeforces 176B (线性DP+字符串)
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...
- CodeForces 176B Word Cut (计数DP)
Word Cut Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Submit St ...
- HDU 1003 Max Sum --- 经典DP
HDU 1003 相关链接 HDU 1231题解 题目大意:给定序列个数n及n个数,求该序列的最大连续子序列的和,要求输出最大连续子序列的和以及子序列的首位位置 解题思路:经典DP,可以定义 ...
- poj1458 求最长公共子序列 经典DP
Common Subsequence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 45763 Accepted: 18 ...
- NYOJ - 矩形嵌套(经典dp)
矩形嵌套时间限制:3000 ms | 内存限制:65535 KB 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b< ...
- 51nod 1412 AVL树的种类(经典dp)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1412 题意: 思路: 经典dp!!!可惜我想不到!! $dp[i][k] ...
- NYOJ 16 矩形嵌套(经典DP)
http://acm.nyist.net/JudgeOnline/problem.php?pid=16 矩形嵌套 时间限制:3000 ms | 内存限制:65535 KB 难度: ...
- poj 1050 To the Max 最大子矩阵和 经典dp
To the Max Description Given a two-dimensional array of positive and negative integers, a sub-rect ...
- CS Academy Distinct Neighbours(经典dp)
CS Academy Distinct Neighbours(经典dp) 题意: 求相邻无相同数字的合法的排列数 题解: 题解 先将相同的数字分为一类,假设共有n组 定义\(dp[i][j]\)表示前 ...
随机推荐
- W3C网页标准
W3C标准是一些列标准的集合!在各个企业的基础上做一定的整合,形成一套标准集,便于推广和使用! 根据网页主要由三部分组成:结构(Structure).表现(Presentation)和行为(Behav ...
- Pytorch 初次使用nn包
计算图和autograd是十分强大的工具,可以定义复杂的操作并自动求导:然而对于大规模的网络,autograd太过于底层. 在构建神经网络时,我们经常考虑将计算安排成层,其中一些具有可学习的参数,它们 ...
- web应用基础架构
1.web中间件 中间件是一类连接软件组件和应用的计算机软件,它包括一组服务.以便运行在一台或多台服务器上的多个软件通过网络进行交互.该技术所提供的互操作性,推动了一致分布式体系架构的演进,该架构通常 ...
- 在网页中JS函数自动执行常用三种方法
在网页中JS函数自动执行常用三种方法 在HTML中的Head区域中,有如下函数: <SCRIPT LANGUAGE="JavaScript"> function ...
- os期末复习
登记之后会发生两个变化:读者数增加(v操作).座位数减少(p操作) 注销之后会发生的变化:读者数减少(p操作).座位数增加(v操作) 必须要清楚释放的是甚麽,以及申请的是甚麽资源(在具体的题目当中) ...
- css 文本溢出省略号
单行溢出显示省略号: white-space: nowrap; overflow: hidden; text-overflow: ellipsis; 多行溢出显示省略号: text-overflow: ...
- chart 模板【转】
Helm 通过模板创建 Kubernetes 能够理解的 YAML 格式的资源配置文件,我们将通过例子来学习如何使用模板. 以 templates/secrets.yaml 为例: 从结构看,文件的内 ...
- docker 为镜像添加ssh服务-使用Dockerfile 创建
首先,基于要添加内容的镜像ubuntu:18.04运行一个容器, 在宿主机(下面步骤是在容器中创建的,应该在宿主机创建进行以下步骤) 一.创建一个工作目录 二.创建Dockerfile 和脚本run. ...
- ETC系列产品非接触式读卡器方案:SI522
随着科技的不断发展,出行上高速这是非常寻常的事.但是在很多节假日高峰时期,在高速路口塞车缴费给很多车主造成很大的烦心.为了解决这一系列的问题,科技发明了ETC这种便捷式缴费技术,让车主们顺畅通过高速路 ...
- VUE - 使用axios数据请求时数据绑定时 报错 TypeError: Cannot set property 'xxxx' of undefined 的解决办法
created() { var that=this axios.get('http://jsonplaceholder.typicode.com/todos') .then( ...