zoukankan      html  css  js  c++  java
  • [水题日常]UVA Partitioning by Palindromes

    一句话题意:每次给你一个字符串问最少划分成多少段才能使得每一段都是回文串.




    (下面用\(s[1..n]\)来表示这个字符串)
    \(dp[i]\)\(s[1..i]\)的答案,如果对于某个\(j<i\)\(s[j+1..i]\)是一个回文串,那么就会有\(dp[i]=min(dp[i],dp[j]+1)\)了是吧~

    思路就是这样,不过注意到直接dp的复杂度是\(O(n^3)\)的(dp的时候判断一次回文还要\(O(n)\))…不过可以先\(O(n^2)\)预处理一下
    这样总的复杂度应该是\(O(n^2)\)了…

    大概这样x

    (然后我这里直接瞎搞了233)

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    
    const int N=1005;
    
    int T,len;
    int isPalin[N][N],dp[N];
    char s[N];
    inline int check(int l,int r)
    {
    	if(isPalin[l][r]!=-1)return isPalin[l][r];
    	if(l>=r)return isPalin[l][r]=1;
    	if(s[l]!=s[r])return isPalin[l][r]=0;
    	return isPalin[l][r]=check(l+1,r-1);
    }
    int main()
    {
    	scanf("%d",&T);
    	while(T--)
    	{
    		memset(isPalin,-1,sizeof(isPalin));
    		scanf("%s",s+1);
    		len=strlen(s+1);
    		for(int i=1;i<=len;i++)
    		{
    			dp[i]=i;
    			for(int j=0;j<i;j++)
    			{
    				if(check(j+1,i))dp[i]=min(dp[i],dp[j]+1);
    			}
    		}
    		printf("%d\n",dp[len]);
    	}return 0;
    }
  • 相关阅读:
    de4dot 反混淆
    GreyMagic
    HearthBuddy 第一次调试
    dnSpy
    asp.net form submit 在Chrome里面看Form提交
    关于并发模型 Actor 和 CSP
    Go语言并发机制初探
    CyclicBarrier的工作原理及其实例
    Java并发编程--CyclicBarrier
    CountDownLatch的简单理解
  • 原文地址:https://www.cnblogs.com/yoshinow2001/p/7603462.html
Copyright © 2011-2022 走看看