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個硬...