0
点赞
收藏
分享

微信扫一扫

动态规划——初步学习笔记

爱写作的小土豆 2022-04-03 阅读 64

初学算法,通过csdn等相关的文章,资料的学习做一些笔记。

定义:

基本思想与策略编辑:

译成人话:

————————————————
出处:CSDN博主「BS有前途」的原创文章

案例一:

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int n;   //台阶的数量
	scanf("%d",&n);
	int d[n];
	d[0]=1;
	d[1]=2;
	for(int i=2;i<n;i++)
	{
		d[i]=d[i-1]+d[i-2]; 
	}
	printf("%d",d[n-1]);    //青蛙跳n阶台阶的种数 
	return 0;
}

我认为这个例题就是基于著名的 Fibonacci 数列
案例二:

#include<stdio.h>
#include<stdlib.h>
int main() {
	int m,n;  //网格的长与宽
	scanf("%d%d",&m,&n);
	int d[m][n];
	for(int i=0; i<m; i++) {
		d[i][0]=1;
	}
	for(int j=0; j<n; j++) {
		d[0][j]=1;
	}
	for(int i=1;i<m;i++)
	{
		for(int j=1;j<n;j++)
		{
			d[i][j]=d[i-1][j]+d[i][j-1];
		}
	}
	printf("%d",d[m-1][n-1]);
}

注:一定要根据动态规划的定义来分解题目,不然很难理解这段代码:

for(int i=0; i<m; i++) {
		d[i][0]=1;
	}
	for(int j=0; j<n; j++) {
		d[0][j]=1;
	}

实际上就是先将初始点的数据初始化,在叠加到之后的位置上。
案例三:

#include<stdio.h>
#include<stdlib.h>

int min(int x,int y);

int main() {
	int m,n;  //网格的长与宽
	scanf("%d%d",&m,&n);
	int d[m][n];
	int arr[m][n];
	for(int i=0; i<m; i++) {
		for(int j=0; j<n; j++) {
			scanf("%d",&arr[i][j]);
		}
	}
	d[0][0]=arr[0][0];
	for(int i=1; i<m; i++) {
		d[i][0]=d[i-1][0]+arr[i][0];
	}
	for(int j=1; j<n; j++) {
		d[0][j]=d[0][j-1]+arr[0][j];
	}
	for(int i=1; i<m; i++) {
		for(int j=1; j<n; j++) {
			d[i][j]=min(d[i-1][j],d[i][j-1])+arr[i][j];
		}
	}
	printf("%d",d[m-1][n-1]);
}
int min(int x,int y) {
	if(x<y) {
		return  x;
	} else {
		return y;
	}
}

与上题不同的就是添加了每个子问题的最优解(该问题就是每个子位置的最短路径)。
案例四:


举报

相关推荐

0 条评论