Codeforces 156C (DP)
2015-09-09 00:12
375 查看
[TOC]
@(K ACMer) by 题解工厂
定义:dp[i][j]为长度为i,ASCII值为j的序列的种数.
那么不难想到:dp[i][j]=∑k=1....26dp[i−1][j−k]dp[i][j] = \sum_{k=1....26} dp[i - 1][j - k](这里假设多加的这一位可能是从A到Z的字符)
@(K ACMer) by 题解工厂
题意:
给你一个小写字母构成的序列,序列内支持相邻的字符进行ASCII码迁移操作(即一个ASCII码加x,另一个就减x).问该序列可以变换为多少种其它不同的序列.分析:
典型的种类计数问题,容易想到要用DP.但是直接想是不容易想到的.需要观察迁移操作的特点是整个序列的ASCII码始终是不变的.定义:dp[i][j]为长度为i,ASCII值为j的序列的种数.
那么不难想到:dp[i][j]=∑k=1....26dp[i−1][j−k]dp[i][j] = \sum_{k=1....26} dp[i - 1][j - k](这里假设多加的这一位可能是从A到Z的字符)
Code:
#include <bits/stdc++.h> using namespace std; const int INF = 0x3fffffff, M = (int)(1e5 + 100); const int mod = 1000000007; int dp[109][3000]; int main(void) { ios::sync_with_stdio(false); int t; cin >> t; for (int i = 1; i <= 26; i++) dp[1][i] = 1; for (int i = 2; i <= 101; i++) { for (int j = i; j <= 26 * i; j++) { for (int k = max(1, j - 26); k <= j - 1; k++) { dp[i][j] = (dp[i][j] + dp[i - 1][k]) % mod; } } } string s; while (t--) { cin >> s; int sum = 0; for (int i = 0; i < s.size(); i++) sum += s[i] - 'a' + 1; cout << (dp[s.size()][sum] - 1) % mod<< endl; } return 0; }
相关文章推荐
- base-adapter-helper之recyclerview版本,支持多种viewtype布局
- uva 12589 learning vector
- C++中cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
- android BaseAdapter
- XML的四种解析器(dom_sax_jdom_dom4j)原理及性能比较
- Vuforia SDK----增强现实非凡体验
- java之 ------ 类反射【详解】
- nodejs 笔记
- BAPI 修改销售订单的方法 ‘BAPI_SALESORDER_CHANGE’
- Unity3D的Mono是什么
- python-selenium多浏览器支持测试框架
- redis配置文件redis.conf参数说明
- 菜鸟应该怎么学习seo
- 深入解析C++中的虚函数与多态
- [LeetCode#58]Length of Last Word
- [其它招式]强大的VBS,自动化利器
- 线程与进程初理解!
- 第一天
- C#中的多线程 - 同步基础
- unity3d AssetBundle包加密