原题↓
本题为典型的动态规划题,也可用递归来理解
甚至无需定义dp数组,用a[i][j]本身来储存新值即可。
#include<stdio.h>
int m,n;//n行m列
int a[200][90000];
int main(){
int i,j;
scanf("%d%d",&n,&m);
for(i=0;i<n;i++){
for(j=0;j<m;j++)
scanf("%d",&a[i][j]);
}
for(i=0;i<n;i++){
for(j=0;j<m;j++){
if(i==0&&j==0)continue;
else a[i][j]+=max(i,j);}
}
printf("%d",a[n-1][m-1]);
}
int ex(int i,int j){//检查左上三角形的有效下标
if(i>=0&&i<n&&j>=0&&j<m)return 100;
else return 0;
}
int max(int i,int j){//找出左上三角形的MAX
int k,max;
int bb[6],cnt=0;
if(ex(i-3,j)){bb[cnt++]=a[i-3][j];}
if(ex(i-2,j)){bb[cnt++]=a[i-2][j];}
if(ex(i-1,j)){bb[cnt++]=a[i-1][j];}
if(ex(i-2,j-1)){bb[cnt++]=a[i-2][j-1];}
if(ex(i-1,j-1)){bb[cnt++]=a[i-1][j-1];}
if(ex(i-1,j-2)){bb[cnt++]=a[i-1][j-2];}
if(ex(i,j-3)){bb[cnt++]=a[i][j-3];}
if(ex(i,j-2)){bb[cnt++]=a[i][j-2];}
if(ex(i,j-1)){bb[cnt++]=a[i][j-1];}
max=bb[0];
for(k=1;k<cnt;k++)if(max<bb[k])max=bb[k];
return max;
}
相关dp练习题 蓝桥原题----数字三角形
小白一只,还没学过动态规划,用的是笨方法,大佬勿喷。