栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【动态规划】美妙的歌声

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【动态规划】美妙的歌声

【动态规划】美妙的歌声 题目




解题思路

设f[i][0/1]为唱到第i位,结尾为0/1(da为0,do为1)
枚举上一段最后的位置,其答案*2的中间s个数次方的累加和为结果


代码
#include
#include
#include
using namespace std;
string s;
int n,l,r,a[5010];
long long power[5010],f[5010][3],mo;
int main()
{
	freopen("listen.in","r",stdin);
	freopen("listen.out","w",stdout);
	cin>>s;
	n=s.size();
	scanf("%d%d%lld",&l,&r,&mo);
	power[0]=1;
	f[0][0]=f[0][1]=1;
	for (int i=0;i
		if (s[i]=='S') a[i+1]+=a[i]+1;
		   else a[i+1]=a[i];
		power[i+1]=power[i]*2%mo;
	}
	for (int i=1;i<=n;i++)
	    for (int j=max(0,i-r);j<=i-l;j++)
	    {
	    	f[i][0]=(f[i][0]+f[j][1]*power[a[i-1]-a[j]]%mo)%mo;
	    	if (a[i]-a[i-1]) f[i][1]=(f[i][1]+f[j][0]*power[a[i-1]-a[j]]%mo)%mo;  //此位置上是s才能唱do 
		}
	printf("%lld",(f[n][0]+f[n][1])%mo);
	return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1003796.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号