首页 > 其他分享 >【DP】CF156C

【DP】CF156C

时间:2023-02-24 13:11:58浏览次数:25  
标签:ch val int 字符串 CF156C DP define

一开始想了一个复杂度爆炸的 DP

分析

首先考察题目的性质:

方便起见,将字符看成是 \([0,25]\) 的值。

注意到操作可以等价于选择任意两个下标,然后对应的两个值一加一减或者一减一加。

这样的操作显然不会改变字符串的值和(也就是字符串中每个字符对应的值的和)

进一步地,可以发现答案就是与当前字符串值和(记为 \(val\))相等的字符串个数(当然因为当前字符串本身不计入,所以答案即为所有合法且值和为 \(val\) 的字符串个数 - 1)

这里合法字符串就是每个字符为小写字符的字符串。

考虑 DP 求解:

记长 \(i\) 个字符,值和为 \(j\) 的合法字符串有 \(f(i, j)\) 个。

那么有转移:\(f(i, j) = \sum_c f(i-1, j-c)\),其中 \(c\in [0, 25]\) 且 \(j-c \geq 0\)。

// Problem: Cipher
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/CF156C
// Memory Limit: 250 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include<bits/stdc++.h>
using namespace std;
 
#define debug(x) cerr << #x << ": " << (x) << endl
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define dwn(i,a,b) for(int i=(a);i>=(b);i--)
#define pb push_back
#define all(x) (x).begin(), (x).end()
 
#define x first
#define y second
using pii = pair<int, int>;
using ll = long long;
 
inline void read(int &x){
    int s=0; x=1;
    char ch=getchar();
    while(ch<'0' || ch>'9') {if(ch=='-')x=-1;ch=getchar();}
    while(ch>='0' && ch<='9') s=(s<<3)+(s<<1)+ch-'0',ch=getchar();
    x*=s;
}

const int N=110, mod=1e9+7;

int f[N][2605];

int add(int x, int y){
	return x+y>=mod? x+y-mod: x+y<0? x+y+mod: x+y;
}

void init(){
	f[0][0]=1;
	rep(i, 1, 100){
		rep(j, 0, 2600){
			rep(c, 0, 25){
				if(j-c>=0) f[i][j]=add(f[i][j], f[i-1][j-c]);
			}
		}
	}
}

void solve(){
	string s; cin>>s;
	int n=s.size();
	int val=0;
	for(auto i: s) val+=(i-'a');
	cout<<add(f[n][val], -1)<<endl;
}

signed main(){
	init();
	int cs; cin>>cs;
	while(cs--) solve();
	return 0;
}

标签:ch,val,int,字符串,CF156C,DP,define
From: https://www.cnblogs.com/Tenshi/p/17151050.html

相关文章

  • 动态规划(DP算法)详解
    什么是动态规划:动态规划_百度百科内容太多了不作介绍,重点部分是无后效性,重叠子问题,最优子结构。问S->P1和S->P2有多少种路径数,毫无疑问可以先从S开始深搜两次,S->P1和S->......
  • 【YBT2023寒假Day14 B】二进制数(数位DP)(数学)
    二进制数题目链接:YBT2023寒假Day14B题目大意问你[A,B]之间有多少个整数,满足它二进制表示下(不要前导0)子串00,01,10,11个数分别是a,b,c,d。其中A,B<=2^{100000},a......
  • hdu 4284 Travel(压缩DP,4级)
    TravelTimeLimit:10000/5000MS(Java/Others)    MemoryLimit:32768/32768K(Java/Others)TotalSubmission(s):2641    AcceptedSubmission(s):724......
  • 【微元贡献法 & 连续段 dp】「JOI Open 2016」摩天大楼 - 题解
    「JOIOpen2016」摩天大楼-题解注意到绝对值求和的形式,比较自然地想到将权值\(a\)排序以规避绝对值,下文默认\(a\)按从小到大排序,且插入元素的顺序亦为从小到大。......
  • k8s部署wordpress
    nginxnginx.confserver{listen80;server_namelocalhost;location/{root/apps/nginx/wordpress;indexindex.phpind......
  • TCP和UDP的区别及使用场景
    一、TCP和UDP是什么?   TCP:   传输控制协议(TCP,TransmissionControlProtocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC793定义。   ......
  • m基于LDPC+QPSK通信链路误码率matlab仿真
    1.算法描述       LDPC(Low-densityParity-check,低密度奇偶校验)码是由Gallager在1963年提出的一类具有稀疏校验矩阵的线性分组码(linearblockcodes),然而......
  • ARC121F Logical Operations on Tree【DP】
    给定一棵树,给每个点填\(0\)或\(1\),给每条边填\(\text{AND}\)或\(\text{OR}\),求有多少种填法满足存在一种缩边的顺序,使得每次把一条边的两个端点缩成一个点,权为原端点......
  • 基于MATLAB的LDPC编译码误码率仿真,仿真调制为64QAM,对比不同译码迭代次数
    1.算法描述LDPC码是麻省理工学院RobertGallager于1963年在博士论文中提出的一种具有稀疏校验矩阵的分组纠错码。几乎适用于所有的信道,因此成为编码界近年来的研究热点。它......
  • UDP协议
    UDP协议概述UDP(UserDatagramProtocol)协议和TCP协议都是传输层协议,UDP仅在IP数据报的基础上增加了两个基本的服务:复用和分用以及差错检测。UDP的优点如下:UDP无需建......