#include<iostream>
#include<algorithm>
#define maxs 1001
using namespace std;
int d[maxs][maxs];
int r;
int maxnum(int i,int j)
{
if(i==r)
return d[i][j];
else
{
return max(maxnum(i+1,j),maxnum(i+1,j+1))+d[i][j];
}
}
int main(void)
{
int b;
scanf("%d",&r);
for(int i=0;i<r;i++)
{
for(int j=0;j<=i;j++)
{
scanf("%d",&d[i][j]);
}
}
b=maxnum(0,0);
printf("%d",b);
}
用递归写的,其实和直接两层循环遍历复杂度差不多
果然超时
因为会重复算一部分路径的值,所以创建一个数组来存储已经算出来的值,算过就直接赋值
#include<iostream>
#include<algorithm>
#define maxs 1001
using namespace std;
int d[maxs][maxs];
int dd[maxs][maxs];
int r;
int maxnum(int i,int j) {
int x,y;
if(r==i)
return d[i][j];
else {
if(dd[i+1][j+1]>-1) {
x=dd[i+1][j+1];
} else {
x=maxnum(i+1,j+1);
dd[i+1][j+1]=x;
}
if(dd[i+1][j]>-1) {
y=dd[i+1][j];
} else {
y=maxnum(i+1,j);
dd[i+1][j]=y;
}
return max(x,y)+d[i][j];
}
}
int main(void) {
int b;
scanf("%d",&r);
for(int i=0; i<r; i++)
for(int j=0; j<=i; j++) {
scanf("%d",&d[i][j]);
dd[i][j]=-1;
}
b=maxnum(0,0);
printf("%d",b);
}
当然,其实可以一维数组就行,但是我这种蠢货不太容易想到,也就不考虑了