首页 > 其他分享 >[一本通1683]稗田阿求(一本通高手训练-1683)

[一本通1683]稗田阿求(一本通高手训练-1683)

时间:2024-10-04 21:01:26浏览次数:7  
标签:ans 1683 long step 一本 稗田 对应 255

有句话说得好 记忆化搜索=动态规划

训练的时候看了:< (cnblogs.com)>

不过我觉得不需要状态压缩,用更好理解的方法写代码。

转移方式一:

如果加入这一组,那就需要这一组满足前面的对应关系。并加上这一组所带来的对应关系。

转移方式二:

不加入这一组。

直接上代码,有注释的。

 1 // ZZQF5677 | 20241004
 2 #include <bits/stdc++.h>
 3 using namespace std;
 4 long long n, m;
 5 // 对于每一组可选也可以不选。
 6 struct Node {
 7     string s;
 8     long long len;
 9     long long a[255]; // 每个数字对应的字母。 
10     long long zm[255]; // 每个字母对应的数字。 
11 } C[255];
12 long long ans = 0;
13 long long k[255]; /*k[i]=j 数字 i 对应字母 j*/
14 long long l[255]; /*l[i]=j 字母 i 对应数字 j*/
15 void dfs(long long step/*处理到第几个*/, long long num/*当前可行的组数*/) {
16     if (step > m) {
17         ans = max(ans, num);
18         return ;
19     }
20     if (num + m - step + 1 < ans) {
21         return ;
22     }    
23     // 选这一个:
24     //step++; // 一定要注意:这里处理的是下一个状态。 
25     bool f = 1;
26     for (long long i = 1; i <= C[step].len; i++) {
27         if (k[C[step].a[i]] != 0 && k[C[step].a[i]] != C[step].s[i]) {
28             f = 0;
29             break;
30         }
31         if (l[C[step].s[i] - 'A' + 1] != 0 && l[C[step].s[i] - 'A' + 1] != C[step].a[i]) {
32             f = 0;
33             break;
34         }
35     } 
36     // 注意一定不能有一个字母对应多个数字。 
37     if (f) {
38         queue<long long> q;
39         while (!q.empty()) {
40             q.pop();
41         }
42         queue<long long> zzz;
43         while (!zzz.empty()) {
44             zzz.pop();
45         }        
46         for (long long i = 1; i <= C[step].len; i++) {
47             if (k[C[step].a[i]] == 0) {
48                 q.push(C[step].a[i]);
49                 k[C[step].a[i]] = C[step].s[i];
50             }
51             if (l[C[step/*记得这里变量打错了!!!*/].s[i] - 'A' + 1] == 0) {
52                 zzz.push(C[step].s[i] - 'A' + 1);
53                 l[C[step].s[i] - 'A' + 1] = C[step].a[i];
54             }
55         }        
56         dfs(step + 1, num + 1);
57         while (!q.empty()) {
58             k[q.front()] = 0;
59             q.pop();
60         }        
61         while (!zzz.empty()) {
62             l[zzz.front()] = 0;
63             zzz.pop();
64         }        
65     }    
66     // 不选这一个: 
67     dfs(step + 1, num);
68     return ;
69 }
70 // 剪枝。 
71 // 当已经赋值了的数字个数、每个数字对应情况相同的时候,选择答案大的。(数据太水了,就不用了。。。。。。) 
72 // 后面的都加上,都比答案小的,删掉。
73 int main() {
74     cin >> n >> m;
75     for (long long i = 1; i <= m; i++) {
76         cin >> C[i].s;
77         C[i].len = C[i].s.size();
78         C[i].s = " " + C[i].s;
79         for (long long j = 1; j <= C[i].len; j++) {
80             cin >> C[i].a[j];
81         }
82     }
83     dfs(1, 0);
84     //dfs(0, op);
85     cout << ans << "\n";
86     return 0;
87 }
88 
89 /*
90 5 3
91 ABCDE
92 1 2 3 4 5
93 AAAAA
94 5 5 5 5 5
95 CCAAA
96 2 2 1 1 1
97 
98 */

 

标签:ans,1683,long,step,一本,稗田,对应,255
From: https://www.cnblogs.com/ZZ114514/p/18447270

相关文章

  • 南沙C++信奥赛陈老师解一本通题 1270:【例9.14】混合背包
    ​ 【题目描述】一个旅行者有一个最多能装V公斤的背包,现在有n件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2,...,Cn。有的物品只可以取一次(01背包),有的物品可以取无限次(完全背包),有的物品可以取的次数有一个上限(多重背包)。求解将哪些物品装入背包可使这些物品的费用总......
  • 南沙C++信奥赛陈老师解一本通题 2099:【23CSPJ普及组】公路(road)
    ​ 2099:【23CSPJ普及组】公路(road)时间限制:1000ms      内存限制:524288KB提交数:3793   通过数: 1575【题目描述】小苞准备开着车沿着公路自驾。公路上一共有 nn 个站点,编号为从 11 到nn。其中站点 ii 与站点i+1i+1 的距离为vivi 公里。......
  • 南沙C++信奥赛陈老师解一本通题 1966:【14NOIP普及组】比例简化
    ​ 【题目描述】在社交媒体上,经常会看到针对某一个观点同意与否的民意调查以及结果。例如,对某一观点表示支持的有1498人,反对的有902人,那么赞同与反对的比例可以简单的记为1498:902。不过,如果把调查结果就以这种方式呈现出来,大多数人肯定不会满意。因为这个比例的数值太大......
  • 南沙C++信奥赛陈老师解一本通题 1820:【00NOIP提高组】进制转换
    ​ 【题目描述】我们可以用这样的方式来表示一个十进制数:将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式。例如,123可表示为1*10^2+2*10^1+3*10^0这样的形式。与之相似的,对二进制数来说,也可表示成每个二进制数码乘以一个以该数字所处位置......
  • 南沙C++信奥赛陈老师解一本通题 1984:【19CSPJ普及组】纪念品
    ​ 【题目描述】小伟突然获得一种超能力,他知道未来 T 天 NN种纪念品每天的价格。某个纪念品的价格是指购买一个该纪念品所需的金币数量,以及卖出一个该纪念品换回的金币数量。每天,小伟可以进行以下两种交易无限次:1.任选一个纪念品,若手上有足够金币,以当日价格购买该纪念品;2......
  • 南沙C++信奥赛陈老师解一本通题 1983:【19CSPJ普及组】公交换乘
    ​ 【题目描述】著名旅游城市B市为了鼓励大家采用公共交通方式出行,推出了一种地铁换乘公交车的优惠方案:1、在搭乘一次地铁后可以获得一张优惠票,有效期为 4545 分钟,在有效期内可以消耗这张优惠票,免费搭乘一次票价不超过地铁票价的公交车。在有效期内指开始乘公交车的时间......
  • 南沙C++信奥赛陈老师解一本通题: 1963:【13NOIP普及组】小朋友的数字
    ​ 【题目描述】有 nn 个小朋友排成一列。每个小朋友手上都有一个数字,这个数字可正可负。规定每个小朋友的特征值等于排在他前面(包括他本人)的小朋友中连续若干个(最少有一个)小朋友手上的数字之和的最大值。作为这些小朋友的老师,你需要给每个小朋友一个分数,分数是这样规定的:......
  • 南沙C++信奥赛陈老师解一本通题 2005:【20CSPJ普及组】直播获奖
    ​ 【题目描述】NOI2130即将举行。为了增加观赏性,CCF决定逐一评出每个选手的成绩,并直播即时的获奖分数线。本次竞赛的获奖率为 w%w%,即当前排名前 w%w% 的选手的最低成绩就是即时的分数线。更具体地,若当前已评出了 pp 个选手的成绩,则当前计划获奖人数为 max(1,⌊p∗w%......
  • 南沙C++信奥赛陈老师解一本通题1965:【14NOIP普及组】珠心算测验
    ​ 【题目描述】珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成一个正整数集合,集合中的数各不......
  • 南沙C++信奥赛陈老师解一本通题:1945:【09NOIP普及组】多项式输出
    ​ 【题目描述】一元 nn 次多项式可用如下的表达式表示: f(x)=anxn+an−1xn−1+...+a1x+a0,an≠0f(x)=anxn+an−1xn−1+...+a1x+a0,an≠0 其中,aixii 称为i次项,ai称为ii次项的系数。给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该多项式:1.多项式中......