給定乙個序列/ 字串,進行一些操作
最後一步將序列/字串去頭/去尾
剩下的會是乙個區間[i,j]
狀態自然定義為f[i][j], 表示面對子串行[i…j] 時的最優性質
667. 最長的回文序列
中文english
給一字串 s, 找出在 s 中的最長回文子串行的長度. 你可以假設 s 的最大長度為 1000.
example
樣例1
輸入: "bbbab"
輸出: 4
解釋:乙個可能的最長回文序列為 "bbbb"
樣例2
輸入: "bbbbb"
輸出: 5
public class solution {
* @param s: the maximum length of s is 1000
* @return: the longest palindromic subsequence's length
public int longestpalindromesubseq(string s) {
// write your code here
char ch = s.tochararray();
if(ch.length==0) {
return 0;
intdp = new int[ch.length][ch.length];
int i,j;
for(i=0;idp[i][i] = 1;
for(i=0;idp[i][i+1] = ( (ch[i]==ch[i+1])? 2:1);
int len;
for(len=3;len<=ch.length;++len) {
//0----len n-len ----len
for(i=0;i<=ch.length-len;++i) {
j = i+len-1;
dp[i][j] = math.max(dp[i][j-1],dp[i+1][j]);
if(ch[i]==ch[j]) {
dp[i][j] = math.max(dp[i][j],dp[i+1][j-1]+2);
return dp[0][ch.length-1];
使用記憶化搜尋
public class solution {
* @param s: the maximum length of s is 1000
* @return: the longest palindromic subsequence's length
public int longestpalindromesubseq(string s) {
// write your code here
ch = s.tochararray();
int n = ch.length;
if(n<=1) return n;
dp = new int[n][n];
int i,j;
for(i=0;ifor(j=i;jdp[i][j] = -1;
dfs(0,n-1);
return dp[0][n-1];
charch = null;
intdp = null;
public void dfs(int i,int j) {
if(dp[i][j] != -1) return;
if(i==j) {
dp[i][j] = 1;
return;
if(i+1==j) {
dp[i][j] = (ch[i]==ch[j]) ? 2:1;
return;
dfs(i,j-1);
dfs(i+1,j);
dfs(i+1,j-1);
dp[i][j] = math.max(dp[i][j-1],dp[i+1][j]);
if(ch[i]==ch[j]) {
dp[i][j] = math.max(dp[i][j],dp[i+1][j-1]+2);
動態規劃 區間型
概述 最長的回文序列 取數是否必勝 給定乙個序列 字串,進行一些操作,最後一步會將序列 字串去頭 去尾 剩下的會是乙個區間 i,j 狀態自然定義為f i j 表示面對子串行 i,j 時的最優性質 1.題目描述 1.給定乙個字串s,長度是n,找到它最長的回文子串行的長度 例子 輸入 bbbab 輸出 ...
區間型動態規劃總結
區間型動態規劃,都是dp i j 由小的區間先計算,然後計算大的區間得到,模板就是 for int len 2 len n len int n s.length int dp new int n n int maxlen 0 for int i 0 i n i char ss s.tochararr...
刪數 dp區間型動態規劃
有n個不同的正整數數x1,x2,xn 排成一排,我們可以從左邊或右邊去掉連續的i個數 只能從兩邊刪除數 1 i n,剩下n i個數,再把剩下的數按以上操作處理,直到所有的數都被刪除為止。每次操作都有乙個操作價值,比如現在要刪除從i位置到k位置上的所有的數。操作價值為 xi xk k i 1 如果只去...