BZOJ 4037 [HAOI2015]数字串拆分 ——动态规划
拆分的情况下,发现f数组本身并不是很好递推。
因为f(123)=f(123)/f(12+3)/f(1+2+3)。
然后考虑f可以怎么表示f(n)=a0*M^n M为转移矩阵。
然后发现 f(x+y)=a0*M(x+y), 所以只需要对M矩阵进行DP即可。
这样子每一个位置就可以表示为若干转移矩阵的和,然后就可以利用矩阵的相乘进行递推。
最后直接用原向量乘上转移矩阵即可。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;#define ll long long
#define F(i,j,k) for (ll i=j;i<=k;++i)
#define D(i,j,k) for (ll i=j;i>=k;--i)
const ll md=998244353;ll m,l;char s[505];struct matrix{ll x[6][6];void init(){memset(x,0,sizeof x);}void build1(){init();x[1][1]=1;}void build2(){init();F(i,1,m) x[i][1]=1;F(i,1,m-1) x[i][i+1]=1;}void build3(){init();F(i,1,m) x[i][i]=1;}matrix operator * (matrix b) {matrix ret;ret.init();F(i,1,m) F(j,1,m){F(k,1,m)ret.x[i][j]=ret.x[i][j]+x[i][k]*b.x[k][j];ret.x[i][j]%=md;}return ret;}matrix operator + (matrix b) {matrix ret;ret.init();F(i,1,m) F(j,1,m)ret.x[i][j]=((ll)x[i][j]+(ll)b.x[i][j])%md;return ret;}
}dp[505],one,c[11][501],turn,now,ans;int main()
{scanf("%s",s+1);l=strlen(s+1);scanf("%lld",&m);F(i,0,l) dp[i].init();one.build1();turn.build2();c[0][0].build3();F(i,1,10) c[i][0]=c[i-1][0]*turn;F(i,1,l-1){c[0][i]=c[0][i-1];c[1][i]=c[10][i-1];F(j,2,10){c[j][i]=c[j-1][i]*c[10][i-1];}}dp[0].build3();F(i,1,l){now.build3();D(j,i,1){now=now*c[s[j]-'0'][i-j];dp[i]=dp[i]+dp[j-1]*now;}}ans=dp[l]*one;printf("%lld\n",ans.x[1][1]);
}
转载于:https://www.cnblogs.com/SfailSth/p/6582010.html
BZOJ 4037 [HAOI2015]数字串拆分 ——动态规划相关推荐
- 小红书面试题——paddingNum,用逗号分割数字串
paddingNum 额,这名字不是我命名的,但是也挺形象的吧,那就叫 paddingNum 吧 题目是这样的 将数字串分割,每隔3位用逗号隔开 eg: 1234 => 1,234; eg: 1 ...
- 算法题解:对于输入数字串,给出另一种数字排列,使得字典序增加尽可能小...
题目分析 题目链接:31. Next Permutation 这题让我们找到比输入数字排列恰好大一点点的数字排列.对这个问题的算法不仅适用于数字串,而且适用于任何有字典序的符号串. 为了方便讨论,我们 ...
- ping 用数字串代替IP地址
Ping命令,大家都比较熟悉,它常被用来测试局域网的连通状态."Ping+IP地址"是大家最常用的一种命令格式,但大家是否注意过Ping命令中的IP地址呢?这里面可是有很多学问和讲 ...
- 计算最长公共数字串个数
一.华为OJ题目(计算最长公共数字个数) 样例输出 输出123058789,函数返回值9 输出54761,函数返回值5 接口说明 函数原型: unsignedint Continumax(char** ...
- 找出连续最长数字串python_字符串中找出连续最长的数字字符串的实例代码
//1. 写一个函数,它的原形是int continumax(char *outputstr,char *intputstr) //功能: //在字符串中找出连续最长的数字串,并把这个串的长度返回, ...
- 《好未来编程题》字符串中找出连续最长的数字串
题目:读入一个字符串str,输出字符串str中的连续最长的数字串 输入描述: 个测试输入包含1个测试用例,一个字符串str,长度不超过255. 输出描述: 在一行内输出str中里连续最长的数字串. 示 ...
- java中实现将一个数字字符串转换成逗号分隔的数字串, 即从右边开始每三个数字用逗号分隔
源代码如下: /*将一个数字字符串转换成逗号分隔的数字串,即从右边开始每三个数字用逗号分隔 */public static void testFenGeNumber(){String number = ...
- [0630]Tyvj 1063 数字串
描述 给你一个长度为n的数字串,数字串里会包含1-m这些数字.如果连续的一段数字子串包含了1-m这些数字,则称这个数字字串为NUM串.你的任务是求出长度最短的NUM串是什么,只需要输出这个长度即可. ...
- 计算机存储数字,数字串在计算机内的表示与存储
数字串在计算机内的表示与存储 人们习惯使用10进制数,而在计算机内,采用二进制表示和处理数据更方便.因此,在计算机输入和输出数据时,要进行十→二和二→十的进制转换处理,这是多数应用环境中的实际情况.而 ...
最新文章
- @这位没带口罩的朋友,你让我感染新冠的风险升高百倍!马普所建模计算结果,认真的...
- 中国碳化硅行业发展走势与需求前景研究报告2022版
- 使用Jmeter进行http接口测试
- 火币网的macd怎么算的_黄金投资中MACD的计算方式
- ngnx 301 302跳转配置方法
- WebSocket介绍
- 怎么加载文件_Java虚拟机从入门到入土之JVM的类加载机制
- linux服务之samba
- 将一个数据插入表中前校验数据是否存在
- 我的美丽天使(My Fair Angel)全剧情攻略
- cs231n图像分类笔记(上)学习记录
- 计算机word英语词汇大全,Microsoft Word - 计算机英语词汇汇总.pdf
- php是什么电器元件,电子元件TP是什么意思 如何封装tp的自定义标签,每个方法代表一个...
- 关于电商库存扣减的解决方案
- Flex语法和常用鼠标手势
- 统计本段话的高频词汇——报错:KeyError
- 一文读懂什么是物联网!
- java 迷你dvd_java基础迷你DVD系统
- 国企银行秋招不完全指南
- python三个箭头怎么打出来_(Python3)Linux和Windows箭头键按下
热门文章
- ubuntu mysql 多硬盘_ubuntu下磁盘空间不足导致mysql无法启动的解决方法
- 写爬虫时遇到的问题及解决方法
- 解决krpano全景视频在QQ浏览器、安卓不能正常播放的问题
- Mac下新安装的MySQL无法登陆root用户解决方法
- homebrew安装失败的解决方案
- com.alibaba.dubbo.rpc.RpcException: Failed to invoke remote method解决方法
- 为什么我的程序在完全循环8192个元素时会变慢?
- 何时使用.First以及何时将.FirstOrDefault与LINQ结合使用?
- 如何仅对文档项目在ECB中应用自定义操作
- maven deploy到nexus报错:Return code is: 401, ReasonPhrase:Unauthorized