1. 程式人生 > >hdu1513Palindrome(動態規劃之最長公共子序列變形+滾動陣列)

hdu1513Palindrome(動態規劃之最長公共子序列變形+滾動陣列)

2題意: 就是填多少字元使之變成迴文字串;#include<iostream> #include<cstring> #include<queue> #include<cstdio> #include<string.h> #include<algorithm> using namespace std; char a[5005],b[5005]; int DP[2][5005];//因為求最長公共子序列只需要兩行。 int main() {     int n;     while(~scanf("%d",&n))     {         getchar();         int i,j;         gets(a);         for(i=n-1;i>=0;i--)             b[n-1-i]=a[i];         //printf("%s\n",b);         memset(DP,0,sizeof(DP));         for(i=1;i<=n;i++)         {              for(j=1;j<=n;j++)              {                  if(a[i-1]==b[j-1])                     DP[i%2][j]=DP[(i-1)%2][j-1]+1;                  else                     DP[i%2][j]=max(DP[(i-1)%2][j],DP[i%2][j-1]);              }         }         printf("%d\n",n-max(DP[1][n],DP[0][n]));//這地方看明白。     }     return 0; }

相關推薦

hdu1513Palindrome動態規劃公共序列變形+滾動陣列

2題意: 就是填多少字元使之變成迴文字串;#include<iostream> #include<cstring> #include<queue> #include<cstdio> #include<string.h> #include<al

動態規劃公共序列LCS

int tdi -s can 數組下標 include har 遞推 最長公共子序列 在字符串S中按照其先後順序依次取出若幹個字符,並講它們排列成一個新的字符串,這個字符串就被稱為原字符串的子串 有兩個字符串S1和S2,求一個最長公共子串

動態規劃公共序列C++原始碼

動態規劃之最長公共子序列 問題: 在序列X={x1,x2,…,xm}與Y={y1,y2,…,yn}中查詢長度最長的公共子序列,往往不是一個。例如:X={A,B,C,B,D,A,B},Y={B,D,C,A,B,A},則公共子序列有Z={B,C,B,A},Z1={B

演算法導論——動態規劃公共序列LCS迴文序列LPS

有兩個字串A和B,假設為A=”abcbdab”,B=”bdcaba”;最長公共子序列(LCS)問題指的時找到A和B的一個公共的子串C,C的長度要是最長。 在這裡我們很明顯的發現最長子序列為”bcba” 用動態規劃的思想來考慮這個問題: 若A={a1,a2,

動態規劃公共序列

圖片 輔助 length ret %s csp TP 子序列 輸出 原理請參考《算法導論》 定義常量 enum {upper_left, up, left}; #define LENGTHA (sizeof(A)/sizeof(A[0])) #define LENGTHB

動態規劃----公共序列

什麽是 資料 lcs 由於 main detail span www. 遞歸 一,問題描述 給定兩個字符串,求解這兩個字符串的最長公共子序列(Longest Common Sequence)。比如字符串1:BDCABA;字符串2:ABCBDAB 則這兩個字符串的最長

動態規劃公共序列&公共

題目  如果字串1的所有字元按其在字串中的順序出現在另外一個字串2中,則字串1稱之為字串2的子序列。  注意,並不要求子子序列(字串1)的字元必須連續出現在字串2中。  請編寫一個函式,輸入兩個字串,求它們的最長公共子串,並打印出最長公共子序列。  例如:輸入兩個字串BDCA

hdu1159公共序列滾動陣列

狀態轉移方程為:dp[i][j]=dp[i-1][j-1]+1(s1[i]==s2[j]);dp[i][j]=max(dp[i-1][j],dp[i][j-1])(s1[i]!=s2[j]) 此題字串的長度不是很大,所以不會超記憶體 程式碼如下: #include<i

動態規劃遞增序列LIS

lib sca while -c -o 組成 describe log ret 在一個已知的序列{ a1,a2,……am}中,取出若幹數組成新的序列{ ai1, ai2,…… aim},其中下標 i1,i2, ……im保持遞增,即新數列中的各個數之間依舊保持原

動態規劃遞增序列Longest Increasing Subsequence

We have discussed Overlapping Subproblems and Optimal Substructure properties in Set 1 and Set 2respectively. 我們已經在前討論了重疊的子問題與最優的子結構屬

MIT演算法導論公開課第15課 動態規劃公共序列

動態規劃(Dynamic programming) 動態規劃是一種設計技巧,而不是一種特定的演算法,就像分治法一樣。 最長公共子序列(Longest common subsequence)問題 有兩個序列,序列x[1~m],序列y[1~n],找到它們的最長

動態規劃求解公共序列LCS

      看了《演算法導論》中文第二版P208的動態規劃求解LCS問題,覺得很贊,但總覺得算導寫得有些晦澀,希望自己能寫得簡單易懂一些,純當鍛鍊了,歡迎指導交流。       首先,子序列和子串是不一樣的。子串是連續的,而子序列中的元素組成可以是不連續的,但元素的位置下標

動態規劃遞增序列 不重複公共序列

【前言】動態規劃:與分治法相似,即通過組合子問題來求解原問題,不同的是分治法是將問題劃分為互不相交的子問題,遞迴求解子問題,再將他們組合起來求出原問題的解。 動態規劃則應用於子問題重疊的情況,通常用來求解最優化問題。這類問題可以有很多可行解,每個解都有一個值,我們希望尋找最

動態規劃公共序列問題

clas == 搜索 ios for 參考 pan 公式 是否 題目描述: 給定兩個字符串s1s2……sn和t1t2……tn。求出這兩個字符串最長的公共子序列的長度。字符串s1s2……sn的子序列指可以表示為si1si2……sim(i1<i2<……<im)

【NOJ1041】【DP_動態規劃公共序列

1041.最長公共子序列 時限:1000ms 記憶體限制:200000K  總時限:3000ms 描述 一個給定序列的子序列是在該序列中刪去若干元素後得到的序列。確切地說,若給定序列X=<x1, x2,…, xm>,則另一序列Z=<z1, z2,

動態規劃實現公共序列

1 public class Test2 { 2 3 static int[][] result; 4 static String str1 = "ABCBDAB"; 5 static String str2 = "BDCABA"; 6 static cha

HDOJ-1160 FatMouse's Speed動態規劃符合序列

連結:HDOJ-1160 Problem Description FatMouse believes that the fatter a mouse is, the faster it runs. To disprove this, you want to take th

動態規劃實現公共序列C語言

思路: 有兩個字元陣列a,b 分為三種情況: 比較a,b陣列當前長度的最後一個字元 相等時, lsc值等於前一段值加1 即:當a[i-1]==b[j-1]時(因為i,j是從1開始,所以是a[i-1],b[j-1]),lsc[i][j]=lsc[i-1][j-1

動態規劃解決公共序列問題

一、相關概念 1 子序列:如果序列Z={z1,z2,z3…zk},可以由序列X={x1,x2,x3…xn}刪除(或不刪除)一些元素得到,則Z為X的一個子序列。Z維持了X序列的相對順序。 2 動態規劃:使用分治法將問題劃分成一個個子問題,當分解的問題共享子問題時,

動態規劃求解公共序列的C++演算法實現

#include<iostream> using namespace std; int CommonOrder(char x[] ,int m ,char y[], int n, char z[]) {     int i,j,k;     int L[10][1