1. 程式人生 > >迴文最小分割數(palindrome-partitioning-ii)

迴文最小分割數(palindrome-partitioning-ii)

class Solution {
public:
	int minCut(string s) {
		//先求解小段的子序列
		vector<vector<int>> dp(s.length(), vector<int>(s.length()));  //存放最小切割數
		vector<vector<bool>> p(s.length(), vector<bool>(s.length(), false));  //存放是否是迴文
		for (int t = 0;t <= s.length();t++) {
			for (int i = 0, j = t;j<s.length();i++, j++) {
				dp[i][j] = compCut(i, j, s, p, dp);
			}
		}
		return dp[0][s.length() - 1];
	}

	// 狀態轉移方程的實現
	int compCut(int i, int j, string &s, vector<vector<bool>> &p, vector<vector<int>> &dp) {
		if (s[i] == s[j] && (j - i < 2 || p[i + 1][j - 1])) {
			p[i][j] = true;
			return 0;
		}
		int min = s.length();
		for (int k = i; k < j; ++k) {
			int a = dp[i][k];
			int b = dp[k + 1][j];
			a = a + b + 1;
			min = min<a ? min : a;
		}
		return min;
	}
};


/*
class Solution {
public:
	int minCut(string s) {
		vector<int> dp(s.length() + 1);
		vector<vector<bool>> p(s.length(), vector<bool>(s.length(), false));
		dp[s.length()] = -1;//確保dp[s.length()-1]=0
		for (int i = s.length() - 1; i >= 0; --i) {
			//下面i==j時肯定是迴文,一定會被替換掉,所以不用去初始化為s.length()-i-1
			dp[i] = INT_MAX;  
			for (int j = i; j < s.length(); ++j) {
				if (s[i] == s[j] && (j - i < 2 || p[i+1][j-1])) {
					dp[i] = min(dp[i], dp[j + 1] + 1);
					p[i][j] = true;
				}
			}
		}
		return dp[0];
	}
};
*/

相關推薦

動態規劃——分割palindrome-partitioning-ii

題目: 給定一個字串str,返回把str全部切成迴文子串的最小分割數。 舉例: str="ABA" ,不需要切割,返回0; str="ACDCDCDAD",最少需要切兩次,比如"A","CDCDC"

分割palindrome-partitioning-ii

class Solution { public: int minCut(string s) { //先求解小段的子序列 vector<vector<int>> dp(s

LeetCode 132. 分割IIPalindrome Partitioning II

題目描述   給定一個字串 s,將 s 分割成一些子串,使每個子串都是迴文串。 返回符合要求的最少分割次數。 示例: 輸入: "aab" 輸出: 1 解釋: 進行一次分割就可將 s 分割成 ["aa","b"] 這樣兩個迴文子串。 &nb

動態規劃——分割

題目: 給定一個字串str,返回把str全部切成迴文子串的最小分割數。 舉例: str="ABA" ,不需要切割,返回0; str="ACDCDCDAD",最少需要切兩次,比如"A","CDCDC","DAD",所以返回2. 解題思路:動態規劃  狀態定

【DP】分割

題目描述 Given a string s, partition s such that every substring of the partition is a palindrome. Retur

《劍指offer》系列 把陣列排成Java

連結 牛客:把陣列排成最小的數 題目描述 輸入一個正整數陣列,把數組裡所有數字拼接起來排成一個數,列印能拼接出的所有數字中最小的一個。例如輸入陣列{3,32,321},則打印出這三個數字能排成的最小數字為321323。 思路 1、全排列 求出陣列中所有數字的全排列

劍指offer-把陣列排成陣列

題目描述 輸入一個正整數陣列,把數組裡所有數字拼接起來排成一個數,列印能拼接出的所有數字中最小的一個。例如輸入陣列{3,32,321},則打印出這三個數字能排成的最小數字為321323。 這道題就是一步步拼接,先把兩個數拼接,得到較小的那個 時間複雜度是O(nlogn) class

51Nod1097 拼成技巧排序

排序規則: 兩個字串a,b。 如果ab<ba 那就a在b之前。 比如a=312,b=31. 31231<31312 所以312在31之前。 排完序就是按照規則輸出就行了。 #include<iostream> #include<algor

找出陣列中第K個快速排序

問題描述:給定一個無序的陣列,從一個數組中找出第K個最小的數,例如,對於給定陣列序列{1,5,2,6,8,0,6},其中第4小的數為5。 演算法思路:採用快速排序,分而治之的思想,根據主元,每次Partiton以主元為軸,比它小的數在左邊,比它大的數在右邊,判

劍指offer:把陣列排成java

題目:輸入一個正整數陣列,把數組裡面所有的數字拼接排成一個數,列印能拼接出的所有數字中的一個。例如輸入陣列{3,32,321},則打印出這3個數字能排成的最小數字321323.     這個題目最直接的做法應該是先求出這個陣列中的所有數字的全排列,然後把每個排列拼接起來,

把陣列排成java

題目描述: 輸入一個正整數陣列,把數組裡所有數字拼接起來排成一個數,列印能拼接出的所有數字中最小的一個。例如輸入陣列{3,32,321},則打印出這三個數字能排成的最小數字為321323。 解題思路: 一開始自己沒想到,便去看了別人的題解,沒想到可以巧妙的使用比較器進行

劍指offer-把陣列排成Java

題目描述 輸入一個正整數陣列,把數組裡所有數字拼接起來排成一個數,列印能拼接出的所有數字中最小的一個。例如輸入陣列{3,32,321},則打印出這三個數字能排成的最小數字為321323。 思路:

把陣列中全部拼接組合成一個劍指offer筆記

題目:輸入一個正整數陣列,把數組裡所有數字拼接起來排成一個數,列印能拼接出的所有數字中最小的一個。例如輸入陣列{3,32,321},則打印出這三個數字能排成的最小數字為321323。先附上程式碼,後面具體講解一下為何這樣寫以及程式碼中涉及到的python方法# -*- cod

動手寫一個的作業系統vmvare+img版

文中提到要用軟盤,天哪嚕,這個年代我在哪去找軟盤。本來準備用u盤替代,但是搜了一下,說是很複雜。於是找到了以下替代方法: 在win10系統上,使用vmvare,從映象檔案啟動。   操作步驟如下: 1. 將書中的編譯程式碼儲存成檔案boot.asm org 07c00

路徑和dp基礎題

原題連結:https://leetcode-cn.com/problems/minimum-path-sum/description/   題目描述: 給定一個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上

Collection.max min值 集合list set map

//list 用來待儲存檔案表中檔案id List<Integer> list=new ArrayList<>(); //file

Leetcode演算法——64、路徑之和minimum path sum

給定一個 m*n 的非負整數矩陣,找到一條路徑,從左上角到右下角,要求這條路徑上的所有陣列之和最小。 備註:每次只能向下或向右移動。 Input: [ [1,3,1], [1,5,1], [4,2,1] ] Output: 7 Explanation: Because

曲線擬合的二乘法基於OpenCV實現

在科學實驗資料處理中,往往要根據一組給定的實驗資料,求出自變數x與因變數y的函式關係,這是為待定引數,由於觀測資料總有誤差,且待定引數ai的數量比給定資料點的數量少(即n<m),因此它不同於插值問題.這類問題不要求通過點,而只要求在給定點上的誤差的平方和最小.當時,即   

Python 迴歸 普通二乘法Ordinary Least Squares

廣義線性迴歸模型: 把作為係數向量(coef_);把作為截距(intercept_) 1.普通最小二乘法(Ordinary Least Squares) 線性迴歸的目的就是是的預測值與實際值的殘差平方和最小: import matplotlib.

曲線擬合的二乘法基於OpenCV實現的,擬合影象中離散點的擬合直線

   今天使用擬合的最小二乘法,求出了給定的一組座標系上的點對最接近的直線的。  其具體理論如下:    在科學實驗資料處理中,往往要根據一組給定的實驗資料,求出自變數x與因變數y的函式關係,這是為待定引數,由於觀測資料總有誤差,且待定引數ai的數量比給定資料點的數量少(