洛谷P1385 密令 题解 动态规划
题目链接:https://www.luogu.com.cn/problem/P1385
题目大意:
给定一小写字母串s,每次操作你可以选择一个p(1<=p<|s|)执行下述修改中的任意一个:
- 将s[p]改为其字典序+1的字母,将s[p+1]改为其字典序-1的字母
或 - 将s[p]改为其字典序-1的字母,将s[p+1]改为其字典序+1的字母
在经过任意多次操作后,串s能变化成多少种字符串?
修改过程中必须保证s是合法的小写字母串(即不能对字母‘a’进行字典序-1的操作),答案对1000000007(10^9 + 7)取模。
解题思路:
这里说的 字典序(其实就是ASCII码),
对于一个字符串,可以执行的上述 2 种操作都不会更改字符串中所有字符的 ASCII 码总和,所以我们可以定义状态 \(f[i][j]\) 表示前 \(i\) 个字符中的 ASCII码总和为 \(j\) 的情况下的方案数,则可以得到状态转移方程为:
- 对于所有的 \(i == 1\) (假设字符串坐标从 1 开始),
\(f[1][j] = 1\) (\(0 \le j \lt 26\)); - 对于所有 \(i \lt 1\) ,
\(f[i][j] = \sum_{k=0}^{\min(25,j)} f[i-1][j-k]\)
那么给我们一个字符串 s ,我们只需要知道其长度 n 以及 ASCII码之和(因为都是小写字母,所以都减去字符 'a' 的 ASCII 码),即 令一个变量 sum = \(\sum_{i=1}^{n} s[i] - 'a'\) (假设字符串坐标从 1 开始),则总的方案数为 \(f[n][sum]\) ,但是题目问的是合法的转换,那么也就是说原始的字符串不在考虑之内,所以最终的答案还要减1。
实现代码如下:
#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1000000007LL;
long long f[101][2610];
string s;
int T, n, sum;
void init() {
for (int i = 0; i < 26; i ++) f[1][i] = 1;
for (int i = 2; i <= 100; i ++)
for (int j = 0; j < i*26; j ++)
for (int k = 0; k < 26 && j-k >= 0; k ++)
f[i][j] = (f[i][j] + f[i-1][j-k]) % MOD;
}
int main() {
init();
cin >> T;
while (T --) {
cin >> s;
n = s.length();
sum = 0;
for (int i = 0; i < n; i ++) sum += s[i] - 'a';
cout << (f[n][sum] - 1 + MOD) % MOD << endl;
}
return 0;
}
洛谷P1385 密令 题解 动态规划的更多相关文章
- 洛谷NOIp热身赛题解
洛谷NOIp热身赛题解 A 最大差值 简单树状数组,维护区间和.区间平方和,方差按照给的公式算就行了 #include<bits/stdc++.h> #define il inline # ...
- 洛谷P2827 蚯蚓 题解
洛谷P2827 蚯蚓 题解 题目描述 本题中,我们将用符号 ⌊c⌋ 表示对 c 向下取整. 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓. 蛐蛐国里现 ...
- 洛谷P1816 忠诚 题解
洛谷P1816 忠诚 题解 题目描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意.但是由于一些人 ...
- [POI 2008&洛谷P3467]PLA-Postering 题解(单调栈)
[POI 2008&洛谷P3467]PLA-Postering Description Byteburg市东边的建筑都是以旧结构形式建造的:建筑互相紧挨着,之间没有空间.它们共同形成了一条长长 ...
- 洛谷P1280 && caioj 1085 动态规划入门(非常规DP9:尼克的任务)
这道题我一直按照往常的思路想 f[i]为前i个任务的最大空暇时间 然后想不出来怎么做-- 后来看了题解 发现这里设的状态是时间,不是任务 自己思维还是太局限了,题做得太少. 很多网上题解都反着做,那么 ...
- [NOI 2020 Online] 入门组T1 文具采购(洛谷 P6188)题解
原题传送门 题目部分:(来自于考试题面,经整理) [题目描述] 小明的班上共有 n 元班费,同学们准备使用班费集体购买 3 种物品: 1.圆规,每个 7 元. 2.笔,每支 4 元. 3.笔记本,每本 ...
- [洛谷P3948]数据结构 题解(差分)
[洛谷P3948]数据结构 Description 最开始的数组每个元素都是0 给出n,opt ,min,max,mod 在int范围内 A: L ,R ,X 表示把[l,R] 这个区间加上X(数组的 ...
- [CodePlus 2017 11月赛&洛谷P4058]木材 题解(二分答案)
[CodePlus 2017 11月赛&洛谷P4058]木材 Description 有 n棵树,初始时每棵树的高度为 Hi ,第 i棵树每月都会长高 Ai.现在有个木料长度总量为 S的订单, ...
- 洛谷P1189 SEARCH 题解 迭代加深
题目链接:https://www.luogu.com.cn/problem/P1189 题目大意: 给你一个 \(n \times m\) 的矩阵,其中有一些格子可以走,一些各自不能走,然后有一个点是 ...
随机推荐
- Android Joda-time工具类
Joda-Time提供了一组Java类包用于处理包括ISO8601标准在内的date和time.可以利用它把JDK Date和Calendar类完全替换掉,而且仍然能够提供很好的集成. Joda- ...
- HDFS概念
- Project Euler Problem 18-Maximum path sum I & 67-Maximum path sum II
基础的动态规划...数塔取数问题. 状态转移方程: dp[i][j] = num[i][j] + max(dp[i+1][j],dp[i+1][j+1]);
- oracle避免在索引列上使用NOT
通常, 我们要避免在索引列上使用NOT, NOT会产生在和在索引列上使用函数相同的 影响. 当ORACLE”遇到”NOT,他就会停止使用索引转而执行全表扫描. 举例: 低效: (这里,不使用索引) S ...
- laravel博客后台操作步骤
- Android Animation动画详解(一): 补间动画
前言 你有没有被一些APP中惊艳的动画效果震撼过,有没有去思考,甚至研究过这些动画是如何实现的呢? 啥?你没有思考,更没有研究过? 好吧,那跟着我一起来学习下如何去实现APP中那些让我们惊羡的动画特效 ...
- 2018-6-24-WPF-使用RPC调用其他进程
title author date CreateTime categories WPF 使用RPC调用其他进程 lindexi 2018-06-24 14:41:29 +0800 2018-2-13 ...
- Python--day61 PyCharm连接MySQL工具的使用
第一步:连接mysql数据工具的位置 第二步:选定数据库 第三步:下载驱动 第四步:连接数据库配置 第五步:在pycharm中查看数据库中的表 第六步:添加数据 第七步:打开用sql语句操作数据库的界 ...
- Wunder Fund Round 2016 (Div. 1 + Div. 2 combined)
现在水平真的不够.只能够做做水题 A. Slime Combining 题意:就是给n个1给你.两个相同的数可以合并成一个数,比如说有两个相同的v,合并后的值就是v+1 思路:直接模拟栈 #inclu ...
- P1029 栈的基础操作
题目描述 现在给你一个栈,它一开始是空的,你需要模拟栈的操作.栈的操作包括如下: "push x":将元素 x 放入栈中,其中x是一个int范围内的整数: "pop&qu ...