洛谷P1216 [USACO1.5]數字三角形 Number Triangles
阿新 • • 發佈:2018-12-11
解題思路: 不能直接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;
}