题目链接
洛谷P1216 [USACO1.5]数字三角形 Number Triangles
解题思路:
不能直接dfs,一定会超时!!
采用记忆化搜索或者动态规划可解决,
//直接dfs,过一半数据
#include <iostream>
#include<cstdio>
#define N 1010
using namespace std;
int a[N][N], n,ans=-1;
int vis[N][N];
void dfs(int step,int col,int sum){
if(step>n||col>step) return;
if(step==n){
ans=max(ans,sum);
return;
}
for(int i=0;i<=1;i++){
if(col+i<1||col+i>step+1)
continue;
if(step+1>n)
return;
if(!vis[step+1][col+i]){
vis[step+1][col+i]=1;
dfs(step+1,col+i,sum+a[step+1][col+i]);
vis[step+1][col+i]=0;
}
}
}
int main(int argc, char** argv) {
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
scanf("%d",&a[i][j]);
dfs(1,1,a[1][1]);
printf("%d\n",ans);
return 0;
}
//记忆化搜索
#include <iostream>
#include<cstdio>
#define N 1010
using namespace std;
int a[N][N], n;
int vis[N][N],f[N][N];
int dfs(int step,int col){
int ans=-1;
if(step==n) return a[step][col];
if(f[step+1][col]==-1)
f[step+1][col]=dfs(step+1,col);
if(f[step+1][col+1]==-1)
f[step+1][col+1]=dfs(step+1,col+1);
ans=a[step][col]+max(f[step+1][col],f[step+1][col+1]);
return ans;
}
int main(int argc, char** argv) {
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++){
scanf("%d",&a[i][j]);
f[i][j]=-1;
}
int ans=dfs(1,1);
printf("%d\n",ans);
return 0;
}
//动态规划
#include <iostream>
#include<cstdio>
#define N 1010
using namespace std;
int a[N][N], n;
int vis[N][N],f[N][N];
int main(int argc, char** argv) {
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++){
scanf("%d",&a[i][j]);
f[i][j]=a[i][j];
}
for(int i=n-1;i>=1;i--){
for(int j=1;j<=i;j++){
f[i][j]=a[i][j]+max(f[i+1][j],f[i+1][j+1]);
}
}
printf("%d\n",f[1][1]);
return 0;
}