DP问题以及例题

今天重新看了一下动态规划,温故知新确实没错。

看别人的代码是个难熬的过程,而且有的阅读量高的代码,确很冗长,自己又重新写了几个经典例题。

一、两个字符串的最长子序列(注意子序列可以不连续)


/*
 * 两个字符串的最长子序列(注意子序列可以不连续)
 * 
 * 
 */
public class LCS_DP {
	
	public static void main(String[] args) {
		String str1="13456778";
		String str2="357486782";
		
		System.out.println(dp(str1,str2));
	}
	private static int  dp(String str1,String str2){
		
		char s1[]=str1.toCharArray();
		char s2[]=str2.toCharArray();
		int res[][]=new int[s1.length][s2.length];
		for(int i=0;i0)
					up=res[i-1][j];
				if(j>0)
					left=res[i][j-1];
				if(s1[i]==s2[j]){
					if(i==0){
						if(j==0)
							res[i][j]=1;
						else{
							res[i][j]=res[i][j-1]+1;
						}
					}else{
						if(j==0)
							res[i][j]=res[i-1][j]+1;
						else{
							res[i][j]=res[i-1][j-1]+1;
						}
					}
					
				}else{
					res[i][j]=Math.max(up, left);					
				}	
			}
		}
		for(int i=0;i

此题思路https://blog.csdn.net/hrn1216/article/details/51534607

 

二、硬币找零问题(注意贪心可能出错,不是最优解)

package help;

public class MoneyDP {
	public static void main(String[] args) {
		int MoneyValue[]=new int[]{1,20,50}; //目前有1元硬币,2元硬币,50元硬币(默认有序)
		int n=63;//计算至少需要多少个硬币能组成63块
		int minCnt[]=new int[n+1];  //打表
		
		dp(MoneyValue,minCnt,n);
		
		
	}

	private static void dp(int[] moneyValue, int[] minCnt, int n) {
		minCnt[0]=0;
		for(int i=1;i<=n;i++){
			int min=i;
			for(int j=0;j

 

你可能感兴趣的:(学习笔记)