动态规划的经典问题:0-1背包、最长公共子串、最长公共子序列
0-1背包问题
/**
* 0-1背包的优化解法
* 只用一个一维数组记录状态,dp[i]表示容量为i的背包所能装入物品的最大价值
* 用逆序来实现
*/
public static int ZeroOnePack2(int V,int N,int[] weight,int[] value){
//动态规划
int[] dp = new int[V+1];
for(int i=1;i<N+1;i++){
for(int j=V;j>=weight[i-1];j--){
dp[j] = Math.max(dp[j-weight[i-1]]+value[i-1],dp[j]);
}
}
return dp[V];
}
最长公共子串
(字符相邻)
这个代码还未验证
public int findLongest(String A, int n, String B, int m) {
int[][] dp=new int[n+1][m+1];
int max=0;
for (int i = 1; i < n+1; i++) {
for (int j = 1; j <= m+1; j++) {
if (A.charAt(i - 1) == B.charAt(j - 1)) {
max=Math.max(dp[i][j]=dp[i-1][j-1]+1, max);
}
}
}
return max;
}
最长公共子序列
(不一定连续)
public class LCS {
public int findLCS(String A, int n, String B, int m) {
int[][] dp = new int[n + 1][m + 1];
for (int i = 1; i < n + 1; i ++ ) {
for (int j = 1; j < m + 1; j ++ ) {
if(A.charAt(i - 1) == B.charAt(j - 1))
dp[i][j] = dp[i - 1][j - 1] + 1;
else
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
}
}
return dp[n][m];
}
}