zoukankan      html  css  js  c++  java
  • 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 <cctype>
    #include <cfloat>
    #include <climits>
    #include <cmath>
    #include <complex>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <ctime>
    #include <deque>
    #include <functional>
    #include <iostream>
    #include <list>
    #include <map>
    #include <numeric>
    #include <queue>
    #include <set>
    #include <stack>
    #include <vector>
    #define ceil(a,b) (((a)+(b)-1)/(b))
    #define endl '
    '
    #define gcd __gcd
    #define highBit(x) (1ULL<<(63-__builtin_clzll(x)))
    #define popCount __builtin_popcountll
    typedef long long ll;
    using namespace std;
    const int MOD = 1000000007;
    const long double PI = acos(-1.L);
    
    template<class T> inline T lcm(const T& a, const T& b) { return a/gcd(a, b)*b; }
    template<class T> inline T lowBit(const T& x) { return x&-x; }
    template<class T> inline T maximize(T& a, const T& b) { return a=a<b?b:a; }
    template<class T> inline T minimize(T& a, const T& b) { return a=a<b?a:b; }
    
    const int maxn = 1008;
    char s[maxn];
    int f[maxn];
    bool vis[maxn][maxn];
    int n;
    
    bool ok(int x,int y){
    	while(x<y){
    		if (s[x]==s[y]){
    			x++;
    			y--;
    		}else {
    			return false;
    		}
    	}
    	return true;
    }
    
    void init(){
    	memset(vis,0,sizeof(vis));
    	scanf("%s",s+1);
    	n = strlen(s+1);
    	f[0]=0;
    	for (int i=1;i<=n;i++)
    		f[i] = i;
    
    	for (int i=1;i<=n;i++)
    		for (int j=i;j<=n;j++){
    			if (ok(i,j)){
    				vis[i][j]=1;
    			}
    		}
    
    	for (int i=1;i<=n;i++)
    		for (int j=1;j<=i;j++){
    			if (vis[j][i]){
    				f[i] = min(f[i],f[j-1]+1);
    			}
    		}
    	printf("%d
    ",f[n]);
    }
    
    int main() {
    	int t;
    	//freopen("G:\Code\1.txt","r",stdin);
    	scanf("%d",&t);
    	while(t--){
    		init();
    	}
    	return 0;
    }
    

  • 相关阅读:
    linux 系统函数 basename和dirname
    写linux脚本你怎么能不知道位置参数!?
    Linux 使用中history 默认记录数不够用了?
    在C/C++中常用的符号
    java23种设计模式之一: 策略模式
    工作中用到的git命令
    注解@Aspect实现AOP功能
    AOP 面向切面 记录请求接口的日志
    javaWeb导出POI创建的多个excel的压缩文件
    nginx的重试机制以及nginx常用的超时配置说明
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/6746780.html
Copyright © 2011-2022 走看看