Codeforces Round #358 (Div. 2) D Alyona and Strings(DP)
2016-07-02 14:32
417 查看
思路:类似LCS那样的做法只是这里多加了分成K段的要求,那么多加一维就好了
dp[i][j][k][0]表示匹配到s中第i个,t中第j个,组成k段,并且可以向下延续的值
dp[i][j][k][1]表示匹配到s中第i个,t中第j个,组成k段,不可以向下延续的值,转移看代码
#include<bits/stdc++.h>
using namespace std;
int dp[1005][1005][12][2];
char s1[1005],s2[1005];
int main()
{
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
scanf("%s",s1+1);
scanf("%s",s2+1);
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=m;j++)
{
if(s1[i]==s2[j])
for(int kk = 1;kk<=k;kk++)
dp[i][j][kk][0]=max(dp[i-1][j-1][kk][0],dp[i-1][j-1][kk-1][1])+1;
for(int kk = 1;kk<=k;kk++)
dp[i][j][kk][1]=max(max(dp[i-1][j-1][kk][1],dp[i-1][j][kk][1]),max(dp[i][j-1][kk][1],dp[i][j][kk][0]));
}
}
printf("%d\n",dp
[m][k][1]);
}
D. Alyona and Strings
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
After returned from forest, Alyona started reading a book. She noticed strings s and t,
lengths of which are n and m respectively.
As usual, reading bored Alyona and she decided to pay her attention to strings s and t,
which she considered very similar.
Alyona has her favourite positive integer k and because she is too small, k does
not exceed 10. The girl wants now to choose k disjoint
non-empty substrings of string s such that these strings appear as disjoint substrings of string t and
in the same order as they do in string s. She is also interested in that their length is maximum possible among all variants.
Formally, Alyona wants to find a sequence of k non-empty strings p1, p2, p3, ..., pk satisfying
following conditions:
s can be represented as concatenation a1p1a2p2... akpkak + 1,
where a1, a2, ..., ak + 1 is
a sequence of arbitrary strings (some of them may be possibly empty);
t can be represented as concatenation b1p1b2p2... bkpkbk + 1,
where b1, b2, ..., bk + 1 is
a sequence of arbitrary strings (some of them may be possibly empty);
sum of the lengths of strings in sequence is maximum possible.
Please help Alyona solve this complicated problem and find at least the sum of the lengths of the strings in a desired sequence.
A substring of a string is a subsequence of consecutive characters of the string.
Input
In the first line of the input three integers n, m, k (1 ≤ n, m ≤ 1000, 1 ≤ k ≤ 10)
are given — the length of the string s, the length of the string t and
Alyona's favourite number respectively.
The second line of the input contains string s, consisting of lowercase English letters.
The third line of the input contains string t, consisting of lowercase English letters.
Output
In the only line print the only non-negative integer — the sum of the lengths of the strings in a desired sequence.
It is guaranteed, that at least one desired sequence exists.
Examples
input
output
input
output
Note
The following image describes the answer for the second sample case:
dp[i][j][k][0]表示匹配到s中第i个,t中第j个,组成k段,并且可以向下延续的值
dp[i][j][k][1]表示匹配到s中第i个,t中第j个,组成k段,不可以向下延续的值,转移看代码
#include<bits/stdc++.h>
using namespace std;
int dp[1005][1005][12][2];
char s1[1005],s2[1005];
int main()
{
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
scanf("%s",s1+1);
scanf("%s",s2+1);
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=m;j++)
{
if(s1[i]==s2[j])
for(int kk = 1;kk<=k;kk++)
dp[i][j][kk][0]=max(dp[i-1][j-1][kk][0],dp[i-1][j-1][kk-1][1])+1;
for(int kk = 1;kk<=k;kk++)
dp[i][j][kk][1]=max(max(dp[i-1][j-1][kk][1],dp[i-1][j][kk][1]),max(dp[i][j-1][kk][1],dp[i][j][kk][0]));
}
}
printf("%d\n",dp
[m][k][1]);
}
D. Alyona and Strings
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
After returned from forest, Alyona started reading a book. She noticed strings s and t,
lengths of which are n and m respectively.
As usual, reading bored Alyona and she decided to pay her attention to strings s and t,
which she considered very similar.
Alyona has her favourite positive integer k and because she is too small, k does
not exceed 10. The girl wants now to choose k disjoint
non-empty substrings of string s such that these strings appear as disjoint substrings of string t and
in the same order as they do in string s. She is also interested in that their length is maximum possible among all variants.
Formally, Alyona wants to find a sequence of k non-empty strings p1, p2, p3, ..., pk satisfying
following conditions:
s can be represented as concatenation a1p1a2p2... akpkak + 1,
where a1, a2, ..., ak + 1 is
a sequence of arbitrary strings (some of them may be possibly empty);
t can be represented as concatenation b1p1b2p2... bkpkbk + 1,
where b1, b2, ..., bk + 1 is
a sequence of arbitrary strings (some of them may be possibly empty);
sum of the lengths of strings in sequence is maximum possible.
Please help Alyona solve this complicated problem and find at least the sum of the lengths of the strings in a desired sequence.
A substring of a string is a subsequence of consecutive characters of the string.
Input
In the first line of the input three integers n, m, k (1 ≤ n, m ≤ 1000, 1 ≤ k ≤ 10)
are given — the length of the string s, the length of the string t and
Alyona's favourite number respectively.
The second line of the input contains string s, consisting of lowercase English letters.
The third line of the input contains string t, consisting of lowercase English letters.
Output
In the only line print the only non-negative integer — the sum of the lengths of the strings in a desired sequence.
It is guaranteed, that at least one desired sequence exists.
Examples
input
3 2 2 abc ab
output
2
input
9 12 4 bbaaababb abbbabbaaaba
output
7
Note
The following image describes the answer for the second sample case:
相关文章推荐
- 终端设备软件更新方法及装置
- Android应用开发SharedPreferences存储数据的使用方法
- libuv学习笔记(23)
- Android draw学习
- 教学资源网站整理
- Linux内核---6.make menuconfig 流程分析
- Windows server 2008 R2 AD DS搭建(额外DNS)
- array_map array_filter array_walk
- array_map array_filter array_walk
- 07.02_c
- Use BEC to do mobile phone forensics
- python图片验证码生成代码
- IOS上计算文件MD5和计算数据块MD5和复制文件耗时数据
- Linux内核---5.Makefile显示打印信息
- nodejs一文件系统
- poi操作Excel的一些方法
- CSS学习day01---XHTML和HTML的重要区别
- 洛谷P1525 关押罪犯
- DSP、Actel转接板标准电路
- go语言:函数参数传递详解