1 条题解

  • 0
    @ 2024-8-18 0:07:12

    第一层做dfs爆搜,第二层做一次dp

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    #define MAX(a,b) ((a)>=(b)?(a):(b))
    
    int n;
    int mp[15][15];
    int dp[15][15];
    int mx;
    
    void input(){
    	scanf("%d",&n);
    	int x,y,w;
    	while(scanf("%d%d%d",&x,&y,&w)!=EOF){
    		mp[x][y]=w;
    	}
    }
    
    void calc(int sum){
    	memset(dp,0,sizeof(dp));
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n;j++){
    			dp[i][j]=MAX(dp[i-1][j],dp[i][j-1])+mp[i][j];
    		}
    	}
    	if(sum+dp[n][n]>mx){
    		mx=sum+dp[n][n];
    	}
    }
    
    void dfs(int x,int y,int sum){
    	if(x==n&&y==n){
    		calc(sum);
    	}
    	int tmp=mp[x][y];
    	mp[x][y]=0;
    	if(x+1<=n){
    		dfs(x+1,y,sum+tmp);
    	}
    	if(y+1<=n){
    		dfs(x,y+1,sum+tmp);
    	}
    	mp[x][y]=tmp;
    }
    
    void solve(){
    	dfs(1,1,0);
    	printf("%d",mx);
    }
    
    int main()
    {
    	input();
    	solve();
    	return 0;
    }
    
    • 1

    信息

    ID
    53
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    8
    已通过
    1
    上传者