YACS 2022年9月月赛 甲组 T3 123型序列 题解
前几天都在搞比赛,今天终于有空来写其他的题解了
那就写点甲组的装
看了下榜单,最简单的就是
这毕竟是一道甲组的题目,于是时间过去了
一眼就能看出来是一个
首先先来讲一下暴力做法:
暴力
很简单,枚举填什么即可,只能得
我们可以考虑优化,优化方法似乎只有一种:剪枝
意思就是如果我发现当前第i个地方我填的数字已经不符合要求了,那么就可以直接
怎么判断不符合要求呢?
首先我们需要把这
当我们填完i时,只需要检查
怎么判断要求是否符合呢?
因为需要知道任意区间内有几种数字,所以我们可以多加三个变量
分别表示
发现了不合法的就可以直接
但是剪枝依旧没多大用
DP
如果你能想到上面的剪枝优化的话,就应该能够想到这个正解了
如果想要转移,那么我们需要知道任意区间内出现了多少个数字
一眼看下去时间复杂度应该是
那么就可以设计状态了
我们设
但是时间复杂度是
不难发现,
所以我们改一下状态,设
状态转移方程很好想,枚举
另外,如果考虑
因为我太懒了,所以我们采用前推后的写法,就是考虑
那么第
也可以填和
填
填
填
代码很好写,待会儿再更新,主要是再判断一下是否符合要求就可以了,
还有,
代码来啦!
1 #include <vector> 2 #include <iostream> 3 #define int long long 4 using namespace std; 5 int n,m,ans; 6 int a[310],f[310][310][310]; 7 vector<pair<int,int> > v[310]; 8 bool isleg(int a,int b,int c) 9 { 10 for(int i = 0;i < v[a].size();i ++) 11 { 12 int l = v[a][i].first; 13 int cnt1 = v[a][i].second,cnt2 = 1; 14 cnt2 += (b >= l) + (c >= l); 15 if(cnt2 != cnt1) return false; 16 } 17 return true; 18 } 19 signed main() 20 { 21 scanf("%lld%lld",&n,&m); 22 for (int i = 1;i <= m;i++) 23 { 24 int l,r,cnt; 25 scanf("%lld%lld%lld",&l,&r,&cnt); 26 v[r].push_back(make_pair(l,cnt)); 27 } 28 f[1][0][0] = 3; 29 for(int i = 1;i <= n;i ++) 30 { 31 for(int j = 0;j < i;j ++) 32 { 33 for(int k = 0;k < max(1LL,j);k ++) 34 { 35 if(!isleg(i,j,k)) continue; 36 f[i + 1][j][k] = (f[i + 1][j][k] + f[i][j][k]) % 1000000007; 37 f[i + 1][i][j] = (f[i + 1][i][j] + f[i][j][k]) % 1000000007; 38 f[i + 1][i][k] = (f[i + 1][i][k] + f[i][j][k]) % 1000000007; 39 if(i == n) ans = (f[i][j][k] + ans) % 1000000007; 40 } 41 } 42 } 43 printf("%lld\n", ans); 44 return 0; 45 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异