动态规划:两大属性1、最优子结构 2、无后效性
动态规划是求最优解的一种方法,没什么固定模式,但在某种程度又有很大的相似性
几个名词:状态、状态转移、决策
以上就是我对动态规划的一些粗浅理解
这里我把以前学的简单动态规划,列举下来以供一些入门者学习
题意:一个高度为N的由正整数组成的三角形,从上走到下,求经过的数字和的最大值。每次只能走到下一层相邻的数上
由于只可以向下走且是相邻的,我们有两种选择,一、向左下走。二、向右下走
那么到一个位置,只有从它的左上和右上方向之一
我们用矩阵存储信息
那么到site[i][j]这个位置的只有site[i-1][j]、site[i-1][j+1](这是由于储存决定的)
sum[i][j]=max(sum[i-1][j],sum[i-1][j+1])+site[i][j];
然后在最底层找出个最大值,最后再说一下,如果你是个严谨的人,你要在初始化时,做到留心留意
代码如下
#include<stdio.h>
#include<string.h>
#define N 501
int a[N][N];
int main()
{
int n,i,j;
memset(a,0,sizeof(a));
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
scanf("%d",&a[i][j]);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
a[i][j]=a[i-1][j]+a[i][j]>a[i-1][j-1]+a[i][j]?a[i-1][j]+a[i][j]:a[i-1][j-1]+a[i][j];
int max=0;
for(i=1;i<=n;i++)
if(a[n][i]>max)
max=a[n][i];
printf("%d\n",max);
return 0;
}
}
与此题极为类似的还有
聪明的kk,祝你好运!!!