数字三角形路径问题:给定等腰直角数字三角形,请确定从顶至底的某个位置的一条路径,使该路径所经过的数字的总和最大。假设每一步可延直线向下或右斜线向下走。
使用备忘录方法解决数字三角形问题,求解最大数字和、以及其对应的路径。
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include<stdio.h>
using namespace std;
const int m=5;
int v[m][m];
int M[m][m];
int lookuptriag(int i,int j){
int u1,u2;
if(M[i][j]>0)
return M[i][j];
if(i==0 && j==0){
return M[i][j]=v[i][j];
if(i==j){
cout<<i<<j<<M[i][j]<<endl;
M[i][j]=lookuptriag(i-1,j-1)+v[i][j];
return M[i][j];
}else{
if(i>j){
if(i!=0 && j==0){
M[i][j]=lookuptriag(i-1,j)+v[i][j];
cout<<i<<j<<M[i][j]<<endl;
}else{
u1=lookuptriag(i-1,j);
u2=lookuptriag(i,j-1);
M[i][j]=u1>u2?u1+v[i][j]:u2+v[i][j];
return M[i][j];
}
}
}
}
}
void TrackSolution(int i,int j){
printf("%d,%d\n",i,j);
while(i!=0 ||j!=0){
if(i==0){
j--;
printf("%d,%d\n",i,j);
}else{
if(j==0){
i--;
printf("%d,%d\n",i,j);
}else{
if(M[i-1][j]>=M[i][j-1]){
i--;
printf("%d,%d\n",i,j);
}else{
j--;
printf("%d,%d\n",i,j);
}
}
}
}
}
int main(){
int i,j,start,end,t,count;
printf("随机生成数字三角形如下:\n");
for(i=0;i<m;i++){
for(j=0;j<=i;j++){
v[i][j]=rand()%10;
M[i][j]=-1;
printf("%d\t",v[i][j]);
}
printf("\n");
}
count=lookuptriag(m-1,m-1);
printf("备忘录m三角形如下:\n");
for(i=0;i<m;i++){
for(j=0;j<=i;j++){
printf("%d\t",M[i][j]);
}
printf("\n");
}
printf("TrackSolution(追踪解)如下:\n");
TrackSolution(m-1,m-1);
return 1;
}