Educational Codeforces Round 39 F. Fibonacci String Subsequences 区间DP

Description
定义F(0)为0,
F(1)为1,
F(i)为F(i-1)和F(i-2)拼起来。
给一个序列n,求F(x)所有序列n在每一个子序列出现的次数。


Sample Input
4 3 10
3 4 7 2


Sample Output
6


设f[x][l][r]为序列中l到r在F(x)中的价值。
可得转移当r == n时,那么 f [ x ] [ l ] [ r ] = f [ x − 1 ] [ l ] [ r ] ∗ 2 l e n [ F ( x − 2 ) ] f[x][l][r]=f[x-1][l][r]*2^{len[F(x-2)]} f[x][l][r]=f[x1][l][r]2len[F(x2)]
否则 f [ x ] [ l ] [ r ] = f [ x − 1 ] [ l ] [ r ] f[x][l][r]=f[x-1][l][r] f[x][l][r]=f[x1][l][r]
当l == 1时, f [ x ] [ l ] [ r ] = f [ x − 2 ] [ l ] [ r ] ∗ 2 l e n [ F ( x − 1 ) ] f[x][l][r]=f[x-2][l][r]*2^{len[F(x-1)]} f[x][l][r]=f[x2][l][r]2len[F(x1)]
否则 f [ x ] [ l ] [ r ] = f [ x − 2 ] [ l ] [ r ] f[x][l][r]=f[x-2][l][r] f[x][l][r]=f[x2][l][r]
然后你就是左边一段分给F(x-1),右边一段分给F(x-2)即可。


#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
typedef long long LL;
const LL mod = 1e9 + 7;
int _min(int x, int y) {return x < y ? x : y;}
int _max(int x, int y) {return x > y ? x : y;}
int read() {
	int s = 0, f = 1; char ch = getchar();
	while(ch < '0' || ch > '9') {if(ch == '-') f = -1; ch = getchar();}
	while(ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar();
	return s * f;
}

LL f[110][110][110], bin[110];
char ss[110];

int main() {
	int n = read(), x = read();
	scanf("%s", ss + 1);
	for(int i = 1; i <= n; i++) {
		if(ss[i] == '0') f[0][i][i] = 1, f[1][i][i] = 0;
		else f[0][i][i] = 0, f[1][i][i] = 1;
	} bin[0] = bin[1] = 2; for(int i = 2; i <= x; i++) bin[i] = bin[i - 1] * bin[i - 2] % mod;
	for(int k = 2; k <= x; k++) {
		for(int len = 1; len <= n; len++) {
			for(int l = 1; l <= n - len + 1; l++) {
				int r = l + len - 1;
				if(r == n) (f[k][l][r] += f[k - 1][l][r] * bin[k - 2] % mod) %= mod;
				else (f[k][l][r] += f[k - 1][l][r]) %= mod;
				if(l == 1) (f[k][l][r] += f[k - 2][l][r] * bin[k - 1] % mod) %= mod;
				else (f[k][l][r] += f[k - 2][l][r]) %= mod;
				for(int o = l; o < r; o++) {
					(f[k][l][r] += f[k - 1][l][o] * f[k - 2][o + 1][r] % mod) %= mod;
				}
			}
		}
	} printf("%lld\n", f[x][1][n]);
	return 0;
}

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值