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]\)表示前 ...
随机推荐
- Scrapy 中的模拟登陆
目前,大部分网站都具有用户登陆功能,其中某些网站只有在用户登陆后才能获得有价值的信息,在爬取这类网站时,Scrapy 爬虫程序先模拟登陆,再爬取内容 1.登陆实质 其核心是想服务器发送含有登陆表单数据 ...
- 十七 Spring的JDBC模版:使用开源连接池,DBCP,C3P0
DBCP的配置以及使用 引入jar包
- 【转】干货分享-100个shell脚本
本文用于记录学习和日常中使用过的shell脚本 [脚本1]打印形状 打印等腰三角形.直角三角形.倒直角三角形.菱形 #!/bin/bash # 等腰三角形 read -p "Please i ...
- 吴裕雄--天生自然HADOOP学习笔记:Shell工具使用
实验目的 学习使用xshell工具连接Linux服务器 在连上的服务器中进入用户目录 熟悉简单的文件操作命令 实验原理 熟悉shell命令是熟悉使用linux环境进行开发的第一步,我们在linux的交 ...
- 【JS 常用操作】
正则表达式 <script> var str = "(08:30-10:00)"; var patt = /^[(][0-9]{2}:[0-9]{2}-[0-9]{2} ...
- Django:使用django自带的登录模块登录后会默认登录到 /accounts/profile 下的问题
django settings中LOGIN_REDIRECT_URL默认重定向到/accounts/profile下,可通过配置修改
- Adroid ViewPage+GridView实现每页6个元素,三页滑动切换
//}//public class MainActivity extends Activity {// private static final float APP_PAGE_SIZE = 16.0f ...
- 树莓派中实现ll命令
用管了centos的童鞋们,到了一个没有ll命令的环境里,那是多么的痛苦,在baidu后,将实现方法记录如下 方法一: echo "alias ll='ls -l'" >&g ...
- C++ 标准模板库STL 队列 queue 使用方法与应用介绍
C++ 标准模板库STL 队列 queue 使用方法与应用介绍 queue queue模板类的定义在<queue>头文件中. 与stack模板类很相似,queue模板类也需要两个模板参数, ...
- 命令行添加删除tomcat服务
在进行项目布署的时候,有时候我们需要重新添加或者卸载tomcat服务,这里,我们可以在命令提示符下进行操作,步骤如下:1.开始—运行,敲入cmd,回车打开命令提示符.2.进行tomcat所在盘符,如d ...