Codeforces 176B (线性DP+字符串)
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214
题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成新串。问经过K次变形后,与目标串相同的变形方案数。mod 1000000007。
解题思路:
奇葩的字符串DP。照着别人的题解写的,解释不出原理是什么。
首先统计出经过1次变形,就能和目标串相同的中间产物串(包含源串)的个数cnt。len表示源串长度,那么len-cnt就表示和目标串不同的个数。
用dp[i][0]表示第i步变形后,与目标串相同方案数,dp[i][1]则表示不同的方案数,
那么对于每次变形i:
dp[i][0]=dp[i-1][0]*(cnt-1)+dp[i-1][1]*cnt
dp[i][1]=dp[i-1][0]*(len-cnt)+dp[i-1][1]*(len-cnt-1)
-1的原因是本次变形要去掉自身变为自身的情况。
那么最后ans=dp[k][0]。
由于是线性DP,可以滚动数组优化内存,只要2*2空间就行了。
- #include "cstdio"
- #include "cstring"
- #define maxn 2010
- #define mod 1000000007
- #define LL long long
- char s[maxn],e[maxn];
- LL dp[][],k,cnt=,len;
- int main()
- {
- //freopen("in.txt","r",stdin);
- scanf("%s%s%I64d",&s,&e,&k);
- len=strlen(s);
- for(int i=;i<len;i++)
- {
- s[i+len]=s[i];
- if(!strncmp(s+i,e,len)) cnt++;
- }
- dp[][strncmp(s,e,len)!=]=;
- for(int i=;i<=k;i++)
- {
- dp[i%][]=(dp[(i-)%][]*(cnt-)+dp[(i-)%][]*cnt)%mod;
- dp[i%][]=(dp[(i-)%][]*(len-cnt)+dp[(i-)%][]*(len-cnt-))%mod;
- }
- printf("%I64d\n",dp[k%][]);
- }
2913373 | neopenx | CodeForces | 176B | Accepted | 30 | GNU C++ 4.6 | 602 |
2014-10-31 20:00:42
|
Codeforces 176B (线性DP+字符串)的更多相关文章
- CodeForces - 1051D (线性DP)
题目:https://codeforces.com/problemset/problem/1051/D 题意:一个2行n列的矩形,上面有黑白块,然后问你怎么布置才能有k个连通块,问有多少种方案数 思路 ...
- CodeForces - 1038D (线性DP)
题目:https://codeforces.com/problemset/problem/1038/D 题意:给你n个数字,每个数字可以吃左右两边的数,然后吃完后自己变成 a[i]-a[i+1]或者a ...
- Codeforces 176B 经典DP
非常好的一个题目,CF上的DP都比较经典 题意就是 给定一个串A,B,正好执行K次操作,每次操作可以把 A串从中间切开,并调换两部分的位置,问最后得到B串共有多少种不同的切法(只要中间有一次不同,即视 ...
- CodeForces 176B Word Cut (计数DP)
Word Cut Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Submit St ...
- [CodeForces - 1272D] Remove One Element 【线性dp】
[CodeForces - 1272D] Remove One Element [线性dp] 标签:题解 codeforces题解 dp 线性dp 题目描述 Time limit 2000 ms Me ...
- Nowcoder Removal ( 字符串上的线性 DP )
题目链接 题意 : 给出长度为 n 的字符串.问你准确删除 m 个元素之后.能产生多少种不同的子串 分析 ( 参考博客 ): 可以考虑线性 DP 解决这个问题 试着如下定义动态规划数组 dp[i][ ...
- LightOJ1044 Palindrome Partitioning(区间DP+线性DP)
问题问的是最少可以把一个字符串分成几段,使每段都是回文串. 一开始想直接区间DP,dp[i][j]表示子串[i,j]的答案,不过字符串长度1000,100W个状态,一个状态从多个状态转移来的,转移的时 ...
- 动态规划——线性dp
我们在解决一些线性区间上的最优化问题的时候,往往也能够利用到动态规划的思想,这种问题可以叫做线性dp.在这篇文章中,我们将讨论有关线性dp的一些问题. 在有关线性dp问题中,有着几个比较经典而基础的模 ...
- 动态规划_线性dp
https://www.cnblogs.com/31415926535x/p/10415694.html 线性dp是很基础的一种动态规划,,经典题和他的变种有很多,比如两个串的LCS,LIS,最大子序 ...
随机推荐
- Python机器学习库scikit-learn实践
原文:http://blog.csdn.net/zouxy09/article/details/48903179 一.概述 机器学习算法在近几年大数据点燃的热火熏陶下已经变得被人所“熟知”,就算不懂得 ...
- Stanford机器学习---第八讲. 支持向量机SVM
原文: http://blog.csdn.net/abcjennifer/article/details/7849812 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回 ...
- poj3295
Tautology Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10453 Accepted: 3967 Descri ...
- Shell脚本中cd命令使用
在写shell脚本的时候发现cd切换目录的时候无法切换,代码是下面的. #!/bin/bash #changedir.sh history cd /home/firefox sleep pwd 我仔细 ...
- mysql将int 时间类型格式化
摘要 DATE_FORMAT(date,format) 根据format字符串安排date值的格式. DATE_FORMAT(date,format) 根据format字符串安排date值的格式. ...
- 如何使用setup.py文件
setup.py文件的使用:% python setup.py build #编译% python setup.py install #安装% python setup.py sdist ...
- JQgrid for asp.net
转载自http://blog.csdn.net/shiworkyue/article/details/8283716 JQgrid for asp.net 网上资料较少,自己总结了些不全,能用到的可 ...
- vs c++中读取数据流并存储
ifstream in("test.txt"); vector<string> vs; string s; while(!in.eof()) { in>>s ...
- opencv学习笔记(六)直方图比较图片相似度
opencv学习笔记(六)直方图比较图片相似度 opencv提供了API来比较图片的相似程度,使我们很简单的就能对2个图片进行比较,这就是直方图的比较,直方图英文是histogram, 原理就是就是将 ...
- JUC回顾之-volatile的原理和使用
1.计算机内存模型的相关概念 计算机在执行程序时,每条指令都是在CPU中执行的,在指令的执行过程中,涉及到数据的读取和写入.由于程序在运行的过程中数据是放在"主存"中的, 由于数据 ...