• 第六届河南省程序设计大赛:探 寻 宝 藏


    描述

    传说HMH大沙漠中有一个M*N迷宫,里面藏有许多宝物。某天,Dr.Kong找到了迷宫的地图,他发现迷宫内处处有宝物,最珍贵的宝物就藏在右下角,迷宫的进出口在左上角。当然,迷宫中的通路不是平坦的,到处都是陷阱。Dr.Kong决定让他的机器人卡多去探险。

    但机器人卡多从左上角走到右下角时,只会向下走或者向右走。从右下角往回走到左上角时,只会向上走或者向左走,而且卡多不走回头路。(即:一个点最多经过一次)。当然卡多顺手也拿走沿路的每个宝物。

    Dr.Kong希望他的机器人卡多尽量多地带出宝物。请你编写程序,帮助Dr.Kong计算一下,卡多最多能带出多少宝物。

    输入

    第一行: K 表示有多少组测试数据。
    接下来对每组测试数据:
    第1行: M N
    第2~M+1行: Ai1 Ai2 ……AiN (i=1,…..,m)


    【约束条件】
    2≤k≤5 1≤M, N≤50 0≤Aij≤100 (i=1,….,M; j=1,…,N)
    所有数据都是整数。 数据之间有一个空格。

    输出

    对于每组测试数据,输出一行:机器人卡多携带出最多价值的宝物数

    样例输入

    2
    2 3
    0 10 10
    10 10 80
    3 3
    0 3 9
    2 8 5
    5 7 100
    

    样例输出

    120
    134
    

    可以当成是两个同时从a[1][1]出发去a[m][n],所能获得的宝物最大值。

    #include<stdio.h>
    #include<string.h>
    #define N 60
    int a[N][N],dp[N][N][N][N];
    int max(int a,int b)
    {
    	return a>b?a:b;
    }
    int main()
    {
    	int k,i,j,m,n,p,q;
    	scanf("%d",&k);
    	while(k--)
    	{
    		scanf("%d%d",&m,&n);
    		for(i=1;i<=m;i++)
    			for(j=1;j<=n;j++)
    				scanf("%d",&a[i][j]);
    		memset(dp,0,sizeof(dp));
    		for(i=1;i<=m;i++)
    			for(j=1;j<=n;j++)
    				for(p=i+1;p<=m;p++)
    				{
    					q=i+j-p;
    					if(q<=0)
    						continue;
    					dp[i][j][p][q]=max( max(dp[i][j-1][p-1][q],dp[i-1][j][p-1][q]) , max(dp[i-1][j][p][q-1],dp[i][j-1][p][q-1]))+a[i][j]+a[p][q];
    				}
    		dp[m][n][m][n]=max( max(dp[m][n-1][m-1][n],dp[m-1][n][m-1][n]) , max(dp[m-1][n][m][n-1],dp[m][n-1][m][n-1]))+a[m][n];
    		
    		printf("%d
    ",dp[m][n][m][n]);
    		//printf("%d
    ",max( max(dp[m][n-1][m-1][n],dp[m-1][n][m-1][n]) , max(dp[m-1][n][m][n-1],dp[m][n-1][m][n-1]))+a[m][n]);
    	
    	}	
    	return 0;
    } 
  • 相关阅读:
    jenkins+newman+postman实现api自动化
    数据库的关闭方法
    获取2台linux机器的时间差
    性能测试与其分析
    todo:云数据库的元信息
    todo:trove命令使用
    syslog协议及rsyslog服务全解析
    C++Primer学习日记
    excel-填充
    excel-删除
  • 原文地址:https://www.cnblogs.com/zyq1758043090/p/10002944.html
Copyright © 2020-2023  润新知