无记忆数组(35*35)
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int data[35][35];
int MaxSum(int i, int j)
{
if(i == 35)
{
return data[i][j];
}
else
{
int x = MaxSum(i + 1, j);
int y = MaxSum(i + 1, j + 1);
int max = x > y ? x : y;
return max + data[i][j];
}
}
int main()
{
int i,j;
srand((unsigned)time(NULL));
for(i = 0; i < 35; i++)
{
for(j = 0; j < 35; j++)
{
data[i][j] = rand() % 10;
}
}
for(i = 0; i < 35; i++)
{
for(j = 0; j < 35; j++)
{
if(j%35 == 0)
{
printf("\n");
}
printf("%d ",data[i][j]);
}
}
printf("\n\n");
printf("结果为:%d", MaxSum(0,0));
}
结果
有记忆数组(40*40)
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int data[40][40];
int mem[40][40];
int MaxSum(int i, int j)
{
if(i == 40)
return data[i][j];
else
{
if(mem[i + 1][j] == 0)
{
mem[i + 1][j] = MaxSum(i + 1, j);
}
int left = mem[i + 1][j];
if(mem[i + 1][j + 1] == 0)
{
mem[i + 1][j + 1] = MaxSum(i + 1, j + 1);
}
int right = mem[i + 1][j + 1];
int max = left > right ? left : right;
return max + data[i][j];
}
}
int main()
{
int i,j;
srand((unsigned)time(NULL));
for(i = 0; i < 40; i++)
{
for(j = 0; j < 40; j++)
{
data[i][j] = rand() % 10;
}
}
for(i = 0; i < 40; i++)
{
for(j = 0; j < 40; j++)
{
mem[i][j] = 0;
}
}
for(i = 0; i < 40; i++)
{
for(j = 0; j < 40; j++)
{
if(j%40 == 0)
{
printf("\n");
}
printf("%d ",data[i][j]);
}
}
printf("\n\n");
printf("结果为:%d", MaxSum(0,0));
}
结果: