原文連結
一、基本概念
動态規劃過程是:每次決策依賴于目前狀态,又随即引起狀态的轉移。一個決策序列就是在變化的狀态中産生出來的,是以,這種多階段最優化決策解決問題的過程就稱為動态規劃。
importjava.util.;
publicclassExchange {
publicintcountWays(int[] penny,intn,intaim) {
// write code here
if(n==0||penny==null||aim<0){
return0;
int[][] pd =newint[n][aim+1];
for(inti=0;i
pd[i][0] =1;
for(inti=1;penny[0]*i<=aim;i++){
0][penny[0]*i] =1;
}
for(inti=1;i
for(intj=0;j<=aim;j++){
if(j>=penny[i]){
pd[i][j] = pd[i-1][j]+pd[i][j-penny[i]];
else{
pd[i][j] = pd[i-1][j];
}
returnpd[n-1][aim];
}import java.util.;
public class Exchange {
public int countWays(int[] penny, int n, int aim) {
// write code here
if(n==0||penny==null||aim<0){
return 0;
}
int[][] pd = new int[n][aim+1];
for(int i=0;i
pd[i][0] = 1;
}
for(int i=1;penny[0]*i<=aim;i++){
pd[0][penny[0]*i] = 1;
}
for(int i=1;i
for(int j=0;j<=aim;j++){
if(j>=penny[i]){
pd[i][j] = pd[i-1][j]+pd[i][j-penny[i]];
}else{
pd[i][j] = pd[i-1][j];
}
}
}
return pd[n-1][aim];
}
}
importjava.util.;
publicclassMinimumPath {
publicintgetMin(int[][] map,intn,intm) {
// write code here
int[][] dp =newint[n][m];
for(inti=0;i
for(intj=0;j<=i;j++){
dp[i][0]+=map[j][0];
}
for(inti=0;i
for(intj=0;j<=i;j++){
0][i]+=map[0][j];
}
for(inti=1;i
for(intj=1;j
dp[i][j] = min(dp[i][j-1]+map[i][j],dp[i-1][j]+map[i][j]);
}
returndp[n-1][m-1];
}
publicintmin(inta,intb){
if(a>b){
returnb;
}else{
returna;
}
}import java.util.;
public class MinimumPath {
public int getMin(int[][] map, int n, int m) {
// write code here
int[][] dp = new int[n][m];
for(int i=0;i
for(int j=0;j<=i;j++){
dp[i][0]+=map[j][0];
}
}
for(int i=0;i
for(int j=0;j<=i;j++){
dp[0][i]+=map[0][j];
}
}
for(int i=1;i
for(int j=1;j
dp[i][j] = min(dp[i][j-1]+map[i][j],dp[i-1][j]+map[i][j]);
}
}
return dp[n-1][m-1];
}
public int min(int a,int b){
if(a>b){
return b;
}else{
return a;
}
}
}
importjava.util.;
publicclassGoUpstairs {
publicintcountWays(intn) {
// write code here
if(n<=2)
returnn;
intf =1%1000000007;
ints =2%1000000007;
intt =0;
for(inti=3;i<=n;i++){
1000000007;
f = s;
}
returnt;
}
import java.util.;
public class GoUpstairs {
public int countWays(int n) {
// write code here
if(n<=2)
return n;
int f = 1%1000000007;
int s = 2%1000000007;
int t = 0;
for(int i=3;i<=n;i++){
t = (f+s)%1000000007;
f = s;
s = t;
}
return t;
}
}
importjava.util.*;
publicclassLCS {
publicintfindLCS(String A,intn, String B,intm) {
// write code here
int[][] dp =newint[n][m];
char[] a = A.toCharArray();
char[] b = B.toCharArray();
for(inti=0;i
if(a[i]==b[0]){
dp[i][0] =1;
for(intj=i+1;j
dp[j][0] =1;
break;
for(inti=0;i
if(a[0]==b[i]){
dp[0][i] =1;
for(intj=i+1;j
dp[0][j] =1;
break;
for(inti=1;i
for(intj=1;j
if(a[i]==b[j]){
1][j-1]+1,dp[i-1][j],dp[i][j-1]);
}else{
1][j],dp[i][j-1]);
}
}
returndp[n-1][m-1];
}
publicintmax(inta,intb,intc){
intmax = a;
if(b>max)
max=b;
if(c>max)
max = c;
returnmax;
}
}