区间DP UVA 11584 Partitioning by Palindromes

本文介绍了一种使用区间动态规划解决字符串分割为最少回文串的方法,详细解释了状态转移方程、回文判断逻辑,并通过实例展示了算法的应用。

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

 

题目传送门

 1 /*
 2     题意:给一个字符串,划分成尽量少的回文串
 3     区间DP:状态转移方程:dp[i] = min (dp[i], dp[j-1] + 1); dp[i] 表示前i个字符划分的最少回文串,
 4             如果s[j] 到 s[i]是回文串,那么可以从dp[j-1] + 1递推过来
 5 */
 6 #include <cstdio>
 7 #include <cstring>
 8 #include <algorithm>
 9 #include <cmath>
10 using namespace std;
11 
12 const int MAXN = 1e3 + 10;
13 const int INF = 0x3f3f3f3f;
14 int dp[MAXN];
15 char s[MAXN];
16 
17 bool ok(int l, int r)   {
18     while (l < r)   {
19         if (s[l] != s[r])   return false;
20         l++;    r--;
21     }
22     return true;
23 }
24 
25 int main(void)  {       //UVA 11584 Partitioning by Palindromes
26     int T;  scanf ("%d", &T);
27     while (T--) {
28         scanf ("%s", s + 1);
29         int len = strlen (s + 1);
30         memset (dp, 0, sizeof (dp));
31         for (int i=1; i<=len; ++i)  {
32             dp[i] = i;
33             for (int j=1; j<=i; ++j) {
34                 if (ok (j, i))  {
35                     dp[i] = min (dp[i], dp[j-1] + 1);
36                 }
37             }
38         }
39 
40         printf ("%d\n", dp[len]);
41     }
42 
43     return 0;
44 }

 

转载于:https://www.cnblogs.com/Running-Time/p/4704167.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值