[题解]AT_abc325_g [ABC325G] offence
思路
看到消除区间,并且 果断选择区间 DP。
定义 表示操作 区间能剩下最少数量。
首先枚举 ,然后枚举一个分解点 ,那么显然有 。
如果 是 o
,需要单独考虑一下。
依旧在 寻找 为 f
的 ,如果 不为 ,表明 不能完全操作掉,因此无法使得 挨在一起,形成 of
。
所以当我们找到满足 的 时, 中的所有元素都能被消除,并且可以在 之后顺手消除 个,所以直接将 设为 即可。
Code
#include <bits/stdc++.h>
#define re register
using namespace std;
const int N = 310;
int n,m;
int dp[N][N];
string s;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> s >> m;
n = s.size();
s = ' ' + s;
for (re int i = 1;i <= n;i++){
for (re int j = i;j <= n;j++) dp[i][j] = j - i + 1;
}
for (re int l = 2;l <= n;l++){
for (re int i = 1;i + l - 1 <= n;i++){
int j = i + l - 1;
if (l == 2){
if (s[i] == 'o' && s[j] == 'f') dp[i][j] = 0;
}
else{
for (re int k = i;k < j;k++) dp[i][j] = min(dp[i][j],dp[i][k] + dp[k + 1][j]);
if (s[i] == 'o'){
for (re int k = i + 1;k <= j;k++){
if (s[k] == 'f' && !dp[i + 1][k - 1]) dp[i][j] = min(dp[i][j],max(dp[k + 1][j] - m,0));
}
}
}
}
}
cout << dp[1][n];
return 0;
}
作者:WaterSun
出处:https://www.cnblogs.com/WaterSun/p/18262946
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】