其他分享
首页 > 其他分享> > 动态规划(DP)

动态规划(DP)

作者:互联网

动态规划

  1. 计数
    有多少种方式走到右下角
    有多少种方法选出 K 个数使得和是 m

  2. 求最大最小值
    从左上角走到右下角路径的最大数字和
    最长上升子序列

  3. 求存在性
    取石子游戏
    能不能选出 K 个数使得和是 m


  1. 确定状态
			最后一步(最优策略中使用的最后一枚硬币)
 			化成子问题(最少的硬币拼出更小的面值)
  1. 转移方程
		f[x]=min{f[x-2]+1,f[x-5]+1,f[x-7]+1}
  1. 初始条件和边界情况
		f[0]=0;如果不能拼出X,X=正无穷;
  1. 计算顺序
		f[0],f[1],f[2];
硬币的面值 A[] = { 2,5,7,..... }, 要拼出的钱数 M = 27;

public int coin(int[]A, int M) {
	int[]f = new int[M + 1];
	int n = A.length();
	f[0] = 0;

	for (int i = 1; i <= M; i++) {
		f[i] = MAX_INT;

		for (int j = 0; j < n; j++) {
			if (f >= A[j] && f[i - A[j] != MAX_INT) {
				f[i] = min(f[i - A[j] + 1, f[i]]);
			}
		}
	}
	if (f[M] == MAX_INT) {
		f[M] = -1;
	}
	reurn f[M];
}

标签:硬币,int,MAX,min,拼出,INT,动态,规划,DP
来源: https://blog.51cto.com/u_15260724/2879012