Luogu 2679(dp)(NOIP 2015)
来源:互联网 发布:淘宝订单编号生成规则 编辑:程序博客网 时间:2024/06/07 19:51
传送门
NOIP 2015 D2T2
题解:
定义dp[i][j][k]为a串前i个字符,b串前j个字符,分成k段的方案数(a[i]必须选)。
定义sum[i][j][k]为a串前i个字符,b串前j个字符,分成k段的方案数(a[i]可选可不选)。
直接来要爆空间,所以第一维采用滚动数组优化。
那么两个数组互相转移:
dp[cur][j][k]=sum[cur^1][j-1][k-1]+dp[cur^1][j-1][k](重新作为一段/和之前的一起凑成现有的一段),条件:a[i]==b[j]
sum[cur][j][k]=sum[cur^1][j][k]+dp[cur][j][k](所有之前的方案/当前选第i位的方案)
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;typedef long long ll;const int MAXN=1004,MAXM=204,MOD=1e9+7;int n,m,K;char a[MAXN],b[MAXM];int dp[2][MAXM][MAXM],sum[2][MAXM][MAXM];//a串前i个k段组成b串前j个(i必须选),a串前i个k段组成b串前j个(所有情况)int main() {//freopen("P2679.in","r",stdin);while (~scanf("%d%d%d",&n,&m,&K)) {scanf("%s%s",a+1,b+1);memset(dp,0,sizeof(dp));memset(sum,0,sizeof(sum));int cur=1;sum[cur^1][0][0]=1;for (int i=1;i<=n;++i) {sum[cur][0][0]=1;for (int j=1;j<=m;++j)for (int k=1;k<=K;++k) {dp[cur][j][k]=(a[i]==b[j])?(sum[cur^1][j-1][k-1]+dp[cur^1][j-1][k])%MOD:0;sum[cur][j][k]=(sum[cur^1][j][k]+dp[cur][j][k])%MOD;}cur^=1;}printf("%d\n",sum[cur^1][m][K]);}return 0;}
阅读全文
0 0
- Luogu 2679(dp)(NOIP 2015)
- bzoj 4720/Luogu 1850(期望dp)(NOIP 2016)
- Luogu 1311(dp/模拟)(NOIP 2011)
- Luogu 1280(dp)
- Luogu 1282(dp)
- Luogu 1387(dp)
- Luogu 1156(dp)
- Luogu 1141(dp)
- Luogu 1074(DFS)(NOIP 2009)
- luogu P1044 栈(NOIP 2003)
- Luogu 1880(区间dp)
- Luogu 1351(树形dp)
- Luogu 1040(区间dp)
- Luogu 1144(SPFA+dp)
- Luogu 1074(tarjan+dp)
- Luogu 1525(并查集)(NOIP 2010)
- Luogu 1083(借教室)(NOIP 2012)
- Luogu 1314(二分答案)(NOIP 2011)
- Python 线程通信(wait(), set())
- flask 用户:注册、登录和退出
- STL算法总结
- 安卓有关数据共享的8个问题回答笔记
- mac环境使用pip添加python组件权限不足
- Luogu 2679(dp)(NOIP 2015)
- 停课记录
- php下使用curl进行多种数据编码方式的POST请求
- 看懂正则表达式入门
- 剑指offer之Python练习一
- angularjs之猜字游戏
- PICRUSt:预测宏基因组功能—16S扩增子分析锦上添花
- 学习快速排序
- 简单实用的OkHttp