#include<iostream>
#include<time.h>
#include<stdlib.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,j-1)+v[i][j];
return m[i][j];
}
else if(i>j){
if(i!=0&&j==0){
m[i][j]=lookuptriag(i,j-1)+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(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(){
srand((unsigned int)time(NULL));
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;
}
数字三角形路径问题——备忘录方法
最新推荐文章于 2024-07-24 22:13:06 发布