YACS 2023年2月月赛 甲组 T1 自由贸易 题解
上来一看题和数据范围基本就是 DP 了,问题是状态怎么设计呢?
如果我们仅仅设
再来想一想我们
如果
如果算到
常数非常大,
可以发现:
所以循环的时候前面小于后面,优化掉一个
最终时间复杂度
(甲组 T2 T3,太水了,不写了)
代码:
#include <cstring> #include <iostream> using namespace std; int n, ans, a[200005], b[10]; int f[200005][4][4][4][4]; void ma (int &a, int b) {if (a < b) a = b;} int main () { cin >> n; for (int i = 0; i < n; i ++) for (int j = 0; j < 4; j ++) for (int k = 0; k < 4; k ++) for (int l = 0; l < 4; l ++) for (int m = 0; m < 4; m ++) f[i][j][k][l][m] = -1000000000; for (int i = 1; i <= n; i ++) cin >> a[i]; f[0][0][0][0][0] = 0; for (int i = 0; i < n; i ++) for (int j = 0; j < 4; j ++) { for (int k = 0; k < 4; k ++) for (int l = 0; l < 4; l ++) { for (int m = 0; m < 4; m ++) if (f[i][j][k][l][m] >= 0) { int sum = 0; b[1] = b[2] = b[3] = 0; ++ b[j]; ++ b[k]; ++ b[a[i + 1] ]; for (int t = 1; t <= 3; t ++) if (b[t]) ++ sum; ma (f[i + 1][k][a[i + 1] ][l][m], f[i][j][k][l][m] + sum); sum = 0; b[1] = b[2] = b[3] = 0; ++ b[l]; ++ b[m]; ++ b[a[i + 1] ]; for (int t = 1; t <= 3; t ++) if (b[t]) ++ sum; ma (f[i + 1][j][k][m][a[i + 1] ], f[i][j][k][l][m] + sum); } } } for (int i = 0; i < 4; i ++) for (int j = 0; j < 4; j ++) { for (int k = 0; k < 4; k ++) for (int l = 0; l < 4; l ++) { ans = max (ans, f[n][i][j][k][l]); } } cout << ans; return 0; }
【推荐】国内首个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的设计差异