第九周心得体会

数字三角形路径问题:给定等腰直角数字三角形,请确定从顶至底的某个位置的一条路径,使该路径所经过的数字的总和最大。假设每一步可延直线向下或右斜线向下走。

使用备忘录方法解决数字三角形问题,求解最大数字和、以及其对应的路径。

#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;

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值