uva 11584(动态规划起步第四天 线性DP)

题目很容易,找到状态DP[i] 表示前 i 个字符中最少的划分,那么转移

DP[i] = min {DP[j] + 1 | s[j +1]...s[i] 为 palindromes}

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5
 6 #define REP(i,N) for (int i = 0;i < (N);i++)
 7 #define REP_1(i,N) for (int i = 1;i < (N);i++)
 8 #define REP_2(i,be,en) for (int i = (be);i < (en);i++)
 9 #define DWN(i,N) for (int i = N;i >= 0;i--)
10 #define INF 0x3f3f3f3f
11 #define MAXN 1010
12 using namespace std;
13
14 char str[MAXN];
15 int dp[MAXN];
16
17 bool is_palindromes(int i,int j) {
18     if (i >= j) return 1;
19     if (str[i] == str[j]) return is_palindromes(i + 1,j - 1);
20     else return 0;
21 }
22
23 int main () {
24     int T;
25     freopen("1.txt","r",stdin);
26     cin >> T;
27     while (T--) {
28         scanf("%s",str + 1);
29         int len = strlen(str + 1);
30         REP(i,len + 1) {
31             dp[i] = i;
32             REP(j,i) {
33                 if (is_palindromes(j + 1,i)) {
34                     dp[i] = min(dp[j] + 1,dp[i]);
35                 }
36             }
37         }
38         cout << dp[len] << endl;
39     }
40 }
时间: 2024-12-15 01:42:13

uva 11584(动态规划起步第四天 线性DP)的相关文章

uva 11400 (动态规划起步第四天 线性DP)

题目很简单,LIS变形 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <set> 5 #include <algorithm> 6 7 #define REP(i,N) for (int i = 0;i < (N);i++) 8 #define REP_1(i,N) for (int i = 1;i < (N);i++) 9 #def

uva 10003(动态规划起步第四天 矩阵连乘)

类似矩阵连乘的一道题,很简单DP[i][j]表示区间i,j最少费用, 状态转移为DP[i][j] = min{DP[i][k],DP[k][j]} + a[j] - a[i]; 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 6 #define REP(i,N) for (int i = 0;i < (N);i++) 7 #d

uva 437 ( 动态规划起步第二天 DAG)

由于事情的耽误,导致第二天出来的有点慢,今天是我学动态规划的第二天,做了一个DAG上的最长路.一个立方体的高有三个,然后判断个点之间是否可以连接,然后DAG搞定 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define REP(i,N) for(int i = 0;i < (N);i++) using namespace std; int

Partitioning by Palindromes UVA - 11584 动态规划

题意是给定一个字符串,求最少把它分成多少份,使的每一份都是回文串. 错了好多遍,最后发现是贪心思路出了问题,一开始求出dp[i][j],dp[i][j]表示第i个到第j个这段子串是否是回文串,求出来后,我直接从1开始遍历,每次求最右边的,这种贪心思路是有问题的. 看了赛后别人的才知道可以同动态规划,dp1[i]表示从1到第i个最少分成多少份,知道这思路就可以直接写了. 1 #include <iostream> 2 #include <stdio.h> 3 #include <

uva 11584 Partitioning by Palindromes 线性dp

// uva 11584 Partitioning by Palindromes 线性dp // // 题目意思是将一个字符串划分成尽量少的回文串 // // f[i]表示前i个字符能化成最少的回文串的数目 // // f[i] = min(f[i],f[j-1] + 1(j到i是回文串)) // // 这道题还是挺简单的,继续练 #include <algorithm> #include <bitset> #include <cassert> #include <

POJ 1958 Strange Towers of Hanoi (四塔问题,线性dp,记忆化搜索)

题目分析:四柱汉诺塔.由于题目已经给出了求解方法,直接写代码即可.下面总结一下,四塔问题. 感谢这篇文章的作者,点这里就到,总结的很好.直接贴过来~ 四塔问题:设有A,B,C,D四个柱子(有时称塔),在A柱上有由小到大堆放的n个盘子. 今将A柱上的盘子移动到D柱上去.可以利用B,C柱作为工作栈用,移动的规则如下: ①每次只能移动一个盘子. ②在移动的过程中,小盘子只能放到大盘子的上面. 设计并实现一个求解四塔问题的动态规划算法,并分析时间和空间复杂性. 算法思想: 用如下算法移动盘子(记为Fou

uva 11552 Fewest Flops 线性dp

// uva 11552 Fewest Flops // // 二维线性dp // // 首先,在该块必须是相同的来信.首先记录每块有很多种书 // 称为是counts[i]; // // 订购f[i][j]它代表前i字母j为结尾的最小分块数 // // 假设第i块的開始字母与第i-1块的结束字母同样 // f[i][j] = min(f[i][j],f[i-1][k] + counts[i] - 1); // // 否则 // // f[i][j] = min(f[i][j],f[i-1][k

UVa 11584 Partitioning by Palindromes

/*---UVa 11584 Partitioning by Palindromes --用dp[i]表示前i个字母划分成最小回文串的个数,则有dp[i]=min{dp[j]+1}s[j+1...i]是一个回文串,状态O(n)个 每次有O(n)个决策,而判断是否是回文串复杂度O(n),这样总的复杂度O(n^3).如果事先预处理标记一下s[i...j]是否构成 回文串,这样总的复杂度O(n^2).标记s[i...j]是否构成回文串,用vis[i][j](i<=j)来标记,if s[i]!=s[j]

UVA - 11584 划分字符串的回文串子串; 简单dp

/** 链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34398 UVA - 11584 划分字符串的回文串子串: 简单dp 题目大意: 给一个字符串, 要求把它分割成若干个子串,使得每个子串都是回文串.问最少可以分割成多少个. 定义:dp[i]表示前0~i内的字符串划分成的最小回文串个数: dp[i] = min(dp[j]+1 | j+1~i是回文串); 先预处理flag[i][j]表示以i~j内的字符串为回文串