初学算法,通过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;
}
}
与上题不同的就是添加了每个子问题的最优解(该问题就是每个子位置的最短路径)。
案例四: