1. 程式人生 > >洛谷P1216 [USACO1.5]數字三角形 Number Triangles

洛谷P1216 [USACO1.5]數字三角形 Number Triangles

解題思路: 不能直接dfs,一定會超時!! 採用記憶化搜尋或者動態規劃可解決,f[i][j]=a[i][j]+max(f[i+1][j],f[i+1][j+1])f[i][j]=a[i][j]+max(f[i+1][j],f[i+1][j+1])

//直接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;
}