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

题目链接
洛谷P1216 [USACO1.5]数字三角形 Number Triangles

解题思路:
不能直接dfs,一定会超时!!
采用记忆化搜索或者动态规划可解决, f [ i ] [ j ] = a [ i ] [ j ] + m a x ( 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;
}

猜你喜欢

转载自blog.csdn.net/zhuixun_/article/details/82813033