NOIP2015 子串 解题报告(DP)

原创 2016年08月28日 16:40:48

在线评测:

http://codevs.cn/problem/4560/

整体思路:

dp i,j,k,(0/1) 表示A扫到第i位,B扫到第j位,还可以分成k个子串,当前 这一位加不加入子串;

这时候我们发现空间是不足以AC的,所以我们可以滚动数组一下。

最后我们可以得到DP方程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for (int i = 1;i <= n;i++)
    {
        for (int j = m;j >= 1;j--)
        {
            for (int o = k;o >= 0;o--)
            {
                f[j][o][0] = f[j][o][0] +f[j][o][1];
                f[j][o][0] %= mo;
                if (a[i-1] != b[j-1])
                    f[j][o][1] = 0;else
                    if (o > 0)
                    f[j][o][1] = f[j-1][o-1][0] + f[j-1][o-1][1] + f[j-1][o][1];
                f[j][o][1] %= mo;
            }
        }
    }

失误之处:

开始没有取模,,取模后发现取模的值都爆int,然后gg,就60分

体会心得:

看好数据的范围,,,

AC代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
int n,m,k;
const long long mo = 1000000007;
long long f[250][250][2];
char a[1200],b[1200];
int main()
{
    scanf("%d%d%d",&n,&m,&k);
    scanf("%s%s",a,b);
    f[0][0][0] = 1;
    for (int i = 1;i <= n;i++)
    {
        for (int j = m;j >= 1;j--)
        {
            for (int o = k;o >= 0;o--)
            {
                f[j][o][0] = f[j][o][0] +f[j][o][1];
                f[j][o][0] %= mo;
                if (a[i-1] != b[j-1])
                    f[j][o][1] = 0;else
                    if (o > 0)
                    f[j][o][1] = f[j-1][o-1][0] + f[j-1][o-1][1] + f[j-1][o][1];
                f[j][o][1] %= mo;
            }
        }
    }
    printf("%lld\n",(f[m][k][0] + f[m][k][1]) % mo);
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

【NOIP2015】子串

传送门 在赛场上这道题坑了我不少的时间……还是我太菜了,不过还好写出来了,时间复杂度O(nmk)O(nmk)。 DP的思路很简单 f(k,i,j)f(k, i, j)表示分了k段,用了第一个串中...

[UOJ#149][NOIP2015]子串(dp)

题目描述传送门题解设f(i,j,k)表示从a的前j个字符中选i段连接起来可以和b的前k个匹配的方案数。可以预处理出来g(i,j)表示a的第i个字符和b的第j个字符从后往前最多能匹配多少个。 那么f(...

NOIP2015提高组Day2 子串

题目 分析我在考场上就想到了dp,但是。。 算了,没有但是,这就是结果,是自己努力不够的后果。 好,回到正题。方法0:(考场的sb方法…..) 设f[i,j,k]为a刚好匹配到i,b刚好匹配到...

Vijos[1982]NOIP2015Day2T2 子串 substring 动态规划

子串 (substring.cpp/c/pas) 【问题描述】 有两个仅包含小写英文字母的字符串 A 和 B。现在要从字符串 A 中取出 k 个 互不重叠 的非空子串,然后把这 k 个子串按照其在字符...

NOIP2015提高组Day2 第二题 子串 解题报告

子串NOIP2015提高组Day2题目描述 输入格式输出格式样例输入输入1:6 3 1 aabaab aab输入2:6 3 2 aabaab aab输入3:6 3 3 aabaab aab...

【Noip 2015】 子串 解题报告

今天没有模拟赛,便心血来潮,想练练DP,然后就选了这道Noip 2015 Day2 T2,倒腾了3h。 这道题我开始想的做法太离谱了,结果搞了半天连样例都没过,没办法无奈看题解了,又由于对这道题理解...

noip dp总结

最后做的两个题(飞扬的小鸟、过河)巨坑,,直接做了两天+两个晚上(还都没做出来)实在非常失败 先分题说一下特点: 子串:dp其实挺裸的(相对于思维巨题),要注意字数和连续两个条件 ...

NOIP2015 day2t2 子串

有两个仅包含小写英文字母的字符串 A 和 B。现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一个新的字符串。请问有多少种方案...
  • RecLxf
  • RecLxf
  • 2015年12月06日 17:09
  • 1062

【NOIP2015】子串

有两个仅包含小写英文字母的字符串 AA 和 BB。 现在要从字符串 AA 中取出 kk 个互不重叠的非空子串,然后把这 kk 个子串按照其在字符串 AA 中出现的顺序依次连接起来得到一个新的字符串。...

NOIP 2015 简要题解

[Day 1] T1 神奇的幻方 送分模拟题,但是遇到了一个非常流弊的学弟:
  • ycdfhhc
  • ycdfhhc
  • 2015年11月08日 21:28
  • 5523
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:NOIP2015 子串 解题报告(DP)
举报原因:
原因补充:

(最多只允许输入30个字)