首页 > 其他分享 >题解:P3012 [USACO11FEB] Cowlphabet G

题解:P3012 [USACO11FEB] Cowlphabet G

时间:2024-10-24 21:34:01浏览次数:9  
标签:la int 题解 ll 小写字母 USACO11FEB c2 字母 Cowlphabet

[USACO11FEB] Cowlphabet G

题意

有 \(P\) 种拼接方式,问由 \(U\) 个大写字母和 \(L\) 个小写字母合法组合的方案数。

输出方案数对 \(97654321\) 取模的值。

思路

动态规划,还没有人写逆推方法,刚好我做的逆推。

设 \(f[i][j][z]\) 表示一共有 \(i\) 个字母,其中 \(j\) 个为小写字母,最后一个字母为 \(z\) 的方案数。

那么 \(f[i][j][z]\) 的值为长度为 \(i-1\) 且最后一个字母能和 \(z\) 合法拼接的方案数之和。

设 \(la\) 为能在 \(z\) 前面和 \(z\) 合法组合的字母。

考虑 \(z\) 是大写还是小写:

  • 若 \(z\) 是大写,那么应由所有 \(f[i-1][j][la]\) 转移过来。
  • 否则应由所有 \(f[i-1][j-1][la]\) 转移过来。

最后枚举最后一位是什么字母累加统计答案即可。

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod=97654321;
ll U, L, P;
ll f[502][251][54]; //f[i][j][z]表示一共有i个字母,其中有j个小写字母,最后一个字母为z的方案数 
vector <int> can[54];
int get(char c) {
	if(c>='a'&&c<='z') return c-'a'+1;
	return c-'A'+27;
}
int main() {
	cin >> U >> L >> P;
	char c1, c2;
	for(int i=1; i<=P; i++) {
		cin >> c1 >> c2;
		can[get(c2)].push_back(get(c1)); //因为是枚举上一位所以要反向统计 
	}
	for(int i=1; i<=26; i++) f[1][1][i]=1;
	for(int i=27; i<=52; i++) f[1][0][i]=1;
	for(int i=2; i<=U+L; i++) {
		for(int j=0; j<=L; j++) {
			for(int z=1; z<=52; z++) {
				for(int la:can[z]) {
					if(z<=26&&j) f[i][j][z]=(f[i][j][z]+f[i-1][j-1][la])%mod;
					else if(z>26) f[i][j][z]=(f[i][j][z]+f[i-1][j][la])%mod;
				}
			}
		}
	}
	ll ans=0;
	for(int i=1; i<=52; i++) ans=(ans+f[U+L][L][i])%mod;
	cout << ans; 
	return 0;
}

标签:la,int,题解,ll,小写字母,USACO11FEB,c2,字母,Cowlphabet
From: https://www.cnblogs.com/anins/p/18501370

相关文章

  • 题解:CF2030C A TRUE Battle
    LuoguLink|CodeforcesLink\(\texttt{Describe}\)给一个长度为\(n\)的二进制序列,Alice和Bob在相邻两个0/1中间分别加\(\operatorname{or}\)或\(\operatorname{and}\)操作,优先级满足\(\operatorname{and}>\operatorname{or}\)。Alice希望最后运算的值为\(1\),Bo......
  • P8164 [JOI 2022 Final] 沙堡 2 题解
    DescriptionJOI君在沙滩上堆沙堡,他已经做好了一个沙堡,沙堡可以使用一个\(H\timesW\)的二维矩形表示,其被划分成若干个\(1\times1\)的小格子,格子高度互相不同。JOI君决定在沙堡上游走,他可以从任意一个点出发,向上下左右四个方向行走,必须满足他行走的路径单调下降。出于一......
  • 题解:Maximum AND
    ProblemLinkMaximumAND题外话用sort肘过去了?题面翻译给定数组\(a\)和\(b\),重排\(b\)数组,求\(a_i\oplusb_i\)之后与和的最大值。Solution不难想到按位贪心。从最高位开始,逐位讨论是否能为\(1\)。接下来有一个做法:先将\(a\)数组升序排序,\(b\)数组降序排......
  • AtCoder Regular Contest 185 题解
    A-modMGame2第一个观察是如果一个人手中还有2张牌,那么他一定不会被秒。这可以推出决定胜负的时刻一定是Alice和Bob手中只剩一张牌的时候,此时如果Alice被秒了,那么她就似了,否则她就赢了。考虑Alice什么时候能被秒。记决定胜负的时刻Alice手中的牌是\(a\),Bob手......
  • 23~24 炼石计划 NOIP 练习题部分题解
    目录目录第1组JOISC2017火车旅行IOI2018会议CF1558FStrangeSortAPIO2018新家CTSC2017密钥CF1748EYetAnotherArrayCountingProblem第2组NOI2016区间LOJ552MIN&MAXIJOISC2023合唱LOJ542序列划分LOJ560Menci的序列P8978中位数第3组USACO20FEBHelpYourse......
  • CF35C. Fire Again 题解 bfs求最短路
    题目链接:https://codeforces.com/problemset/problem/35/C视频讲解:https://www.bilibili.com/video/BV1tZ1FYPELp/?p=4以每个着火的点为起点求最短路,然后输出任意一个距离值最大的点即可。需要注意的是:本题是文件输入输出。示例程序:#include<bits/stdc++.h>usingnamespace......
  • CF1139C. Edgy Trees 题解 并查集
    题目链接:https://codeforces.com/problemset/problem/1139/C视频讲解:https://www.bilibili.com/video/BV1tZ1FYPELp?p=3我们可以求总方案数-不满足条件的方案数。设一个不包含黑色边的极大连通块的大小为\(sz_i\)。则答案为\[n^k-\sum\{sz_i^k\}\]示例程序:#include......
  • CF1800E2. Unforgivable Curse (hard version) 题解 并查集
    题目链接:https://codeforces.com/contest/1800/problem/E2视频讲解:https://www.bilibili.com/video/BV1tZ1FYPELp?p=2把下标\(i\)对应到图中编号为\(i\)的节点。节点\(i\)和\(i+k\)之间连一条边,节点\(i\)和\(i+k+1\)之间也连一条边。同一个连通块里的节点对应的字......
  • P5661 [CSP-J2019] 公交换乘 题解
    模拟"公交换乘"按题意模拟即可.注意:可以使用结构体,但是超过时间的优惠券需要被忽略.代码#include<iostream>#include<cstdio>usingnamespacestd;structnode{ intprice,deadline,is_use;//价格,截止时间,是否使用过}a[100005];intn,p,ans,pos=1;int......
  • P5662 [CSP-J2019] 纪念品 题解
    背包因为小伟可以每天进行$2$种操作无限次,所以显然可以使用完全背包.定义状态$f_i$,表示还剩下$i$时,可以拿到钱的最大值.再假设小伟今天买了,明天就卖掉.状态转移方程如下:$f_i=max(f_i,f_{i-p_{k,i}}+p_{k+1,i}-p_{k,i}).$即今天花掉的钱+明天能拿的钱-今天花掉的......