http://acm.hdu.edu.cn/showproblem.php?pid=2084
动态规划的简单问题 从下向上依次找到最优解
递推代码:
#include<stdio.h>
int map[110][110];
int ans[110][110];
int max(int a,int b){
if (a>b)
return a;
else
return b;
}
int main (){
int T;
scanf("%d",&T);
while (T--){
int n;
scanf ("%d",&n);
for (int i=1;i<=n;i++){
for (int j=1;j<=i;j++){
scanf ("%d",&map[i][j]);
}
}
for (int i=1;i<=n;i++){
ans[n][i]=map[n][i];
}
for (int i=n-1;i>=1;i--){
for (int j=1;j<=i;j++){
ans[i][j]=map[i][j]+max(ans[i+1][j],ans[i+1][j+1]); //状态转移方程
}
}
printf ("%d\n",ans[1][1]);
}
return 0;
}
记忆化搜索代码:
#include <stdio.h>
#include <string.h>
int map[110][110];
int ans[110][110];
int n;
int max(int a,int b){
if (a>b)
return a;
else
return b;
}
int solve(int i,int j){
if (ans[i][j]>=0)
return ans[i][j];
return ans[i][j]=map[i][j]+(i==n ? 0:max(solve(i+1,j),solve(i+1,j+1)));
}
int main (){
int T;
scanf("%d",&T);
while (T--){
scanf ("%d",&n);
for (int i=1;i<=n;i++){
for (int j=1;j<=i;j++){
scanf ("%d",&map[i][j]);
}
}
memset(ans,-1,sizeof(ans));
solve(1,1);
printf ("%d\n",ans[1][1]);
}
return 0;
}
动态规划的简单问题 从下向上依次找到最优解