動態規劃的問題總結

2021-08-03 05:37:08 字數 4065 閱讀 9365

1、dp[個數][weight] (例子:poj 1837 balance)

dp[i][w]=relate to (dp[i-1][w-c[j]])

這道題中dp儲存的不是weight,而是方法個數

#include

#include

#include

#include

#include

#include

#define maxnum 15000

using

namespace

std;

int dp[25][maxnum], c, g, good[25], w[25];

int main()}}

printf("%d\n", dp[g][7500]);

return

0;}

2、dp[所有可能的值] (例子:poj 1276 cash machine)

if(dp[i]) dp[i+w[t]*k]=1; 有時候bool型別更好

#include

#include

#include

#include

#include

#include

#define cash 100005

using

namespace

std;

bool dp[cash];

int n, cash, n[20], d[20];

int main()

res = 0;

dp[0] = 1;

for (i = 0; i < n; i++)}}

}printf("%d\n", res);

}return

0;}

3、3276 the cow lexicon

dp[i]=dp[j]+w[i,j] / dp[i]=dp[j]+w[j,i] 乙個是倒著,乙個是順著

dp[i]=dp[i+1]+1 //把這個給刪除了

dp[i]=dp[j]+j-i-len //i~j的串刪除一些字元後能和len匹配的

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

int dp[305], w, l;

char ss[305];

string strs[610];

int main()}}

}}printf("%d\n", dp[0]);

}return

0;}

4 、poj 1836 alignment

難一些的最大上公升子串行

順著求一次最大上公升子串行dpl,倒著求一次最大上公升子串行dpr,然後求dpl[i]+dp=i」>j的最大值

(別人的**,參考部落格:

#include 

#include

const

int max=1005;

int main()

memset(dpr,0,sizeof(dpr));

memset(dpl,0,sizeof(dpl));

dpl[0]=1;

for(i=1;i1;

for(j=i-1;j>=0;j--)}}

dpr[n-1]=1;

for(i=n-2;i>=0;i--)}}

int ans=dpl[n-1];

for(i=0;i1;i++)}}

printf("%d\n",n-ans);

}return

0;}

5 、poj 1260 pearls

題目有點難懂,懂了之後就是dp[i]=dp[j]+w[i,j]的最小值,遍歷j

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

int price[110], num[110], dp[110], sum[110];

int main()

dp[1] = (num[1] + 10) * price[1];

for (i = 2; i <= k; i++)

}cases--;

printf("%d\n", dp[k]);

}return

0;}

dp 陣列的memset很重要!!!!!!!6 、poj 1080 human gene functions

編輯距離的變式

#include

#include

#include

#include

#include

#include

#include

#include

#define maxnum 250

using

namespace

std;

int dp[maxnum][maxnum];

char str1[maxnum], str2[maxnum];

int rep1[maxnum], rep2[maxnum];

int insert[4] = ;

int contrast[4][4] = , , , };

int main()

scanf("%d%s", &len2, str2 + 1);

for (i = 1; i <= len2; i++)

dp[0][0] = 0;

for (i = 1; i <= len1; i++)

for (i = 1; i <= len2; i++)

for (i = 1; i <= len1; i++)

for (j = 1; j <= len2; j++)

printf("%d\n", dp[len1][len2]);

cases--;

}return

0;}

7、poj 1159 palindrome

這道題我以為是乙個字串和他的反向字串求編輯距離的問題,但是仔細想想就不對,ab字串和ba字串的編輯距離就是2,而實際上需要新增的字元個數其實只有1個,所以仔細想想應該也可以用編輯距離的模板去套用,不過目的是求乙個字串和他的反向字串得公共最大字串長度n,然後用字串的長度l減去n就是最後的結果,比如說ab3bd與db3ba的公共子串是b3b,為3,5-3=2就為最後的結果。

accepted 184k 891ms

//這也告訴了我一種新的關於求公共子串行的方法哈哈

#include

#include

#include

#include

#include

#include

#include

#include

#define maxnum 5050

using

namespace

std;

int dp[2][maxnum], n;

char str1[maxnum], str2[maxnum];

int main()

}for (j = 0; j <= len; j++)

dp[0][j] = dp[1][j];

}printf("%d\n", n - dp[1][len]);

}return

0;}

動態規劃—->最優二分檢索樹

**:

動態規劃問題總結

一 什麼是動態規劃?動態規劃演算法通常基於乙個遞推公式及乙個或多個初始狀態。當前子問題的解將由上一次子問題的解推出。使用動態規劃來解題只需要多項式的時間複雜度。二 例子講解 首先,我們要找到某個狀態的最優解,然後在它的幫助下,找到下乙個狀態的最優解。用leetcode上的198題house robb...

經典動態規劃問題總結

動態規劃引入 首先我們以乙個最基本的例子來分析 菲波那切數列。我們都知道,菲波那切數列的遞推公式f n f n 1 f n 2 這裡我就說明一般情況,不列舉邊界條件了 很簡單,如果我們用遞迴的方法來求解f n 兩三行 就出來了。那麼我們深入分析一下這樣有什麼問題?f 2 f 1 f 0 f 3 f ...

動態規劃經典問題總結

假設有幾種硬幣,如1 3 5,並且數量無限。請找出能夠組成某個數目的找零所使用最少的硬幣數。這是一道經典的動態規劃方法,我們可以維護乙個一維動態陣列dp,其中dp i 表示錢數為i時的最小硬幣數的找零,遞推式為 dp i min dp i dp i coins j 1 其中coins j 為第j個硬...