hihoCoder 1367 等式填空
明确题意
等号左边是由'+'和'?'组成的算式,其中处于某个整数(即便这个整数只有一位)首位的'?'可以填入1-9中的某个数字,其余'?'可以填入0-9中的某个数字。
SOURCE
这里未明确等号左边有几个整数(至少有一个)。读题时我未能仔细理解这句话的含义,根据样例误认为有且仅有两个整数相加。另外,等号右边的非负整数,题目虽未明确是否有前导零,可以认为没有(不应该在这里纠结题意)。
做题的第一步是读题,诚哉斯言!
解法
数位DP。
将等号右边的非负整数的数位,按从低位到高位的顺序从1开始编号。
$dp[i][j]$:满足前 $i$ 位且对第 $i+1$ 位的进位是 $j$ 的方案数
$n$ 个正整数相加, 每一位向前一位的进位都小于 $n$
状态转移便转化成了组合计数问题。
将 $n$ 个相同的球放进 $m$ 个不同的盒子里,每个盒子里最多放 $9$ 个球。在这 $n$ 个盒子中指定 $k$ 个,其中每个盒子里至少放一个球。求方案数。
由于放进的球数有上限,并不能用挡板法。
做法:枚举分配到 $k$ 个非空盒子的球的总数,分别计算两类盒子的放置方案数,这两个计数问题都可采用简单的DP解决。
总复杂度:$O(n2+mn3)$,$n$ 是等号左边的数(加数)的个数,$m$ 是等号右边数(和)的位数。
练习题
Implementation
#include <bits/stdc++.h>
using namespace std;
const int N=105;
long long dp[N][50];
const int mod=1e9+7;
char s[N];
int c[2][50][500];
void prep(int n)
{
c[1][0][0]=c[0][0][0]=1;
for(int i=1; i<=n; i++)
{
for(int j=i; j<=9*i; j++)
{
for(int k=1; k<=min(9, j-i+1); k++)
{
c[1][i][j]+=c[1][i-1][j-k], c[1][i][j]%=mod;
}
}
for(int j=0; j<=9*i; j++)
{
for(int k=0; k<=min(9, j); k++)
{
c[0][i][j]+=c[0][i-1][j-k], c[0][i][j]%=mod;
}
}
}
}
vector<int> a;
int main()
{
int ma=0;
for(; ; )
{
int len;
scanf("%*[?]%n%[=+]", &len, s);
a.push_back(len);
ma=max(ma, len);
if(s[0]=='=')
{
break;
}
}
int n;
scanf("%s%n", s+1, &n);
if(n<ma)
{
puts("0");
return 0;
}
prep(a.size());
reverse(s+1, s+n+1);
dp[0][0]=1;
int carry=a.size();
for(int i=1; i<=n; i++)
{
int cnt1=0, cnt2=0;
for(auto x: a)
{
cnt1+=x==i;
cnt2+=x>i;
}
for(int j=0; j<carry; j++)
for(int k=0; k<carry; k++)
{
int tot=s[i]-'0'+10*j-k;
long long sum=0;
for(int l=cnt1; l<=tot; l++)
{
sum+=(long long)c[1][cnt1][l]*c[0][cnt2][tot-l];
sum%=mod;
}
dp[i][j]+=dp[i-1][k]*sum;
dp[i][j]%=mod;
}
}
cout<<dp[n][0]<<endl;
return 0;
}
hihoCoder 1367 等式填空的更多相关文章
- hihocoder -1121-二分图的判定
hihocoder -1121-二分图的判定 1121 : 二分图一•二分图判定 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 大家好,我是小Hi和小Ho的小伙伴Net ...
- Hihocoder 太阁最新面经算法竞赛18
Hihocoder 太阁最新面经算法竞赛18 source: https://hihocoder.com/contest/hihointerview27/problems 题目1 : Big Plus ...
- hihoCoder太阁最新面经算法竞赛15
hihoCoder太阁最新面经算法竞赛15 Link: http://hihocoder.com/contest/hihointerview24 题目1 : Boarding Passes 时间限制: ...
- 【hihoCoder 1454】【hiho挑战赛25】【坑】Rikka with Tree II
http://hihocoder.com/problemset/problem/1454 调了好长时间,谜之WA... 等我以后学好dp再来看为什么吧,先弃坑(╯‵□′)╯︵┻━┻ #include& ...
- 【hihocoder#1413】Rikka with String 后缀自动机 + 差分
搞了一上午+接近一下午这个题,然后被屠了个稀烂,默默仰慕一晚上学会SAM的以及半天4道SAM的hxy大爷. 题目链接:http://hihocoder.com/problemset/problem/1 ...
- 【hihoCoder】1148:2月29日
问题:http://hihocoder.com/problemset/problem/1148 给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期). 思路: 1. 将问题转换成求两个日 ...
- 【hihoCoder】1288 : Font Size
题目:http://hihocoder.com/problemset/problem/1288 手机屏幕大小为 W(宽) * H(长),一篇文章有N段,每段有ai个字,要求使得该文章占用的页数不超过P ...
- 【hihoCoder】1082: 然而沼跃鱼早就看穿了一切
题目:http://hihocoder.com/problemset/problem/1082 输入一个字符串,将其中特定的单词替换成另一个单词 代码注意点: 1. getline(istre ...
- 【hihoCoder】1121:二分图一·二分图判定
题目 http://hihocoder.com/problemset/problem/1121 无向图上有N个点,两两之间可以有连线,共有M条连线. 如果对所有点进行涂色(白/黑),判定是否存 ...
随机推荐
- sql server Cannot resolve the collation conflict between "Chinese_PRC_BIN" and "Chinese_PRC_CI_AS" in the equal to operation
今天查询二个db,出现这个错误,二种方法,一种是把db里的collation改成一样的:如果不方便可以直接在sql语句后面转一下: select * from table where crm_mscr ...
- DRBD+NFS+Keepalived高可用环境
1.前提条件 准备两台配置相同的服务器 2.安装DRBD [root@server139 ~]# yum -y update kernel kernel-devel [root@server139 ~ ...
- 标注偏置问题(Label Bias Problem)和HMM、MEMM、CRF模型比较<转>
转自http://blog.csdn.net/lskyne/article/details/8669301 路径1-1-1-1的概率:0.4*0.45*0.5=0.09 路径2-2-2-2的概率:0. ...
- 模板类 vector
概要 介绍一下模板类 vector 的常用操作,以及一个应用举例,顺时针打印矩阵. 基本定义 模板类 vector 是一种动态数组,它是使用 new 创建动态数组的替代品,实际上,vector 也 ...
- WINDOWS-API:取得系统语言种类-GetOEMCP
GetOEMCP VB声明 Declare Function GetOEMCP Lib "kernel32" Alias "GetOEMCP" () As Lo ...
- Spring持久化之MyBatis
MyBatis是一个优秀的轻量级持久化框架,本文主要介绍MyBatis与Spring集成的配置与用法. 1. Spring MyBatis配置 1.1 添加Maven依赖 在pom.xml文件里添加m ...
- 微信小程序canvas实现圆形计时器功能
index.js import Canvas from '../../utils/canvas.js'Page({ ...Canvas.options, /** * 页面的初始数据 */ data: ...
- LeetCode 朋友圈
班上有 N 名学生.其中有些人是朋友,有些则不是.他们的友谊具有是传递性.如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友.所谓的朋友圈,是指所有朋友的集合. ...
- Luogu P4231 三步必杀 (差分)
目录 题目 题解 题目 题目链接 题目背景 (三)旧都 离开狭窄的洞穴,眼前豁然开朗. 天空飘着不寻常的雪花. 一反之前的幽闭,现在面对的,是繁华的街市,可以听见酒碗碰撞的声音. 这是由被人们厌恶的鬼 ...
- ZOJ Monthly, January 2019-Little Sub and Pascal's Triangle
这个题的话,它每行奇数的个数等于该行行号,如果是0开始的,就该数的二进制中的1的个数,设为k,以它作为次数,2k就是了. #include <stdio.h> int main() { i ...