题意:给出一组数据,呈三角形。求一条从顶到底的路线,使得路线上各数的和最大。
思路:dp[i][j] = max(dp[i-1][j-1],dp[i-1][j])+s[i][j]。采用滚动数组优化
输入:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出:
30
#include <stdio.h>
#include <string.h>
#define N 105
int dp[2][N],s[N];
int n;
int max(int a,int b){
if(a>b)
return a;
return b;
}
int main(){
freopen("a.txt","r",stdin);
while(scanf("%d",&n)!=EOF){
int i,j,res = -1;
memset(dp,0,sizeof(dp));
for(i = 1;i<=n;i++){
for(j = 1;j<=i;j++)
scanf("%d",&s[j]);
for(j = 1;j<=i;j++)//注意边界的处理,多留出一列就不用特判边界了
dp[1][j] = max(dp[0][j-1],dp[0][j])+s[j];
for(j = 0;j<=i;j++)//滚动数组
dp[0][j] = dp[1][j];
}
for(i = 1;i<=n;i++)
res = max(res,dp[1][i]);
printf("%d\n",res);
}
return 0;
}
版本2:
#include <cstdio>
#include <string>
#include <vector>
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#define INF 0x3fffffff
using namespace std;
#define N 105
int s[N],dp[N];
int n;
int main(){
int i,j,res=0;
scanf("%d",&n);
memset(s,0,sizeof(s));
memset(dp,0,sizeof(dp));
for(i = 1;i<=n;i++){
for(j = 1;j<=i;j++){
scanf("%d",&s[j]);
s[j] += max(dp[j-1],dp[j]);
}
for(j = 1;j<=i;j++)
dp[j] = s[j];
}
for(i = 1;i<=n;i++)
res = max(res,dp[i]);
printf("%d\n",res);
return 0;
}