CF 1132 F 题解

本文介绍了Codeforces CF 1132 F题的解题思路,该问题是一个类似消消乐的游戏,目标是求解最少需要进行多少次消除操作。通过采用二维动态规划的方法,可以计算出从位置i到j的最小操作次数。具体转移方程及代码实现文中详述。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题链接:

Problem - F - Codeforces

题意:

消消乐,可以把数组中相邻的字母删掉,问最少要消多少次。

解法:

二维DP。

dp_{i, j} 表示删除 i ~ j 的最少操作数

转移方程:dp_{i, j} = min(dp_{i,j}, \ dp_{i, k} + dp_{k+1, j} - (s_i == s_j))

Code :

 # include <bits/stdc++.h>
//# define int long long
# define pb push_back
# define db double
using namespace std;
 
int n, f[505][505], inf = 1e6;
 
// f_{i, j}:把 i ~ j 全删了的最小代价 
 
char s[505]; 
 
int main(){
	for (int i = 0;i <= 501;i++) for (int j = 0;j <= 501;j++) f[i][j] = inf;
	scanf("%d%s", &n, s+1);
	for (int i = 1;i <= n;i++) f[i][i] = 1;
	for (int i = 2;i <= n;i++){
		for (int l = 1;l <= n;l++){
			int r = l+i-1;
			if (r > n) break;
			for (int j = l;j < r;j++){
				f[l][r] = min(f[l][r], f[l][j] + f[j+1][r]);
			}
			f[l][r] -= (s[l] == s[r]);
		}
	}
	cout << f[1][n];
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值