又一个动态规划 在递归的时候还是出现了问题 对于maxsum和max产生了混淆 还是要把整个程序在纸上写出来才能知道全部过程 是从三角形顶端一直往下走再返回的过程
#include <iostream>
#include <algorithm>
using namespacestd;
int n, dp[105][105];
int Maxsum[105][105];//这里是动态规划
int maxsum(int i,int j){
int x, y;
if(Maxsum[i][j] != -1){
returnMaxsum[i][j];
}
if(i ==n){
Maxsum[i][j] =dp[i][j];
}
else{
x = maxsum(i +1, j);
y = maxsum(i +1, j +1);
Maxsum[i][j] =max(x, y) +dp[i][j];
}
returnMaxsum[i][j];
}
int main(int argc,constchar * argv[]) {
int i, j;
scanf("%d",&n);
memset(Maxsum, -1,sizeof(Maxsum));//初始化 可以方便储存动态规划的数据
for(i =1; i <=n; i ++){
for(j =1;j <= i; j ++){
cin >>dp[i][j];
}
}
cout <<maxsum(1,1) <<endl;
return0;
}
这里还有一个递推的方法 强烈推荐mooc上的北大算法课 思路非常清楚 连本小白都能听懂啦
#include <iostream>
#include <algorithm>
using namespace std;
int n, dp[105][105];
int maxsum[105][105];
int main(int argc, const char * argv[]) {
int i, j;
scanf("%d",&n);
for(i = 1; i <= n; i ++){
for(j = 1;j <= i; j ++){
cin >> dp[i][j];
}
}
for(i = 1; i <= n; i ++){
maxsum[n][i]=dp[n][i];
}
for(i = n-1; i >= 1; i --){
for(j = 1; j <= i; j ++){
maxsum[i][j] = max(dp[i+1][j],dp[i+1][j+1])+dp[i][j];
}
}
cout << maxsum[1][1] << endl;
return 0;
}
//这里是节约空间的做法 将二维数组降为一位数组 再变为指针 指针的用法又忘记了,,
#include <iostream>
#include <algorithm>
using namespace std;
int n, dp[105][105];
int * maxsum;
int main(int argc, const char * argv[]) {
int i, j;
scanf("%d",&n);
for(i = 1; i <= n; i ++){
for(j = 1;j <= i; j ++){
cin >> dp[i][j];
}
}
maxsum = dp[n];
for(i = n-1; i >= 1; i --){
for(j = 1; j <= i; j ++){
maxsum[j] = max(maxsum[j],maxsum[j+1])+dp[i][j];
}
}
cout << maxsum[1] << endl;
return 0;
}