博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NYOJ712
阅读量:6227 次
发布时间:2019-06-21

本文共 1437 字,大约阅读时间需要 4 分钟。

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=712

来看思路:

我们先弱弱的思考一下,首先我们得先从左上角dp到右下角  然后在从右下角dp到左上角 

这样就很有难度 我们可以把来回的路径一次dp完事 这样就简单了很多

我们可以设三维数组dp[k][i][j]  k表示第几步,i和j分别表示来回两个点的坐标  那么我们就有状态转移方程

dp[k][i][j] = max(max(dp[k-1][i][j],dp[k-1][i-1][j-1]),max(dp[k-1][i-1][j],dp[k-1][i][j-1]));

下面看代码:

#include
#include
int dp[110][55][55],a[55][55];int max(int a,int b){ return a > b? a:b;}int main(){ int N,n,m,t,i,j,k; scanf("%d",&N); while(N--) { memset(dp,0,sizeof(dp)); scanf("%d%d",&m,&n); for(i = 1;i <= m;i++) { for(j = 1;j <= n;j++) { scanf("%d",&a[i][j]); } } for(k = 3;k < m + n;k++) { for(i = 1;i <= m;i++) { for(j = i + 1;j <= m;j++) { if(k - i < 1||k - j < 1)break; if(i == j)continue; if(k - i > n||k - j > n)continue; dp[k][i][j] = max(max(dp[k-1][i][j],dp[k-1][i-1][j-1]),max(dp[k-1][i-1][j],dp[k-1][i][j-1])); dp[k][i][j] += a[i][k-i] + a[j][k-j]; } } } int t = m + n; dp[t][m][m] = max(max(dp[t-1][m][m],dp[t-1][m-1][m-1]),max(dp[t-1][m-1][m],dp[t-1][m][m-1])); printf("%d\n",dp[t][m][m] + a[m][n]); } return 0;}

 

转载于:https://www.cnblogs.com/zhanyage110/p/4147602.html

你可能感兴趣的文章
PyQt的Layout的比例化分块。
查看>>
python os模块
查看>>
随机生成验证码
查看>>
用Windows画图改变图片大小(附Linux企鹅头像完全版)。
查看>>
NOSQL系列-Redis精简版安装与Ruby测试
查看>>
追MM 之适配器模式实现
查看>>
一种测试方向的探讨-基于模型测试调研引发的思考 - 2
查看>>
Windows 7可以拯救微软Netbook市场
查看>>
彻底清除 mplay.com与mplay.exe病毒
查看>>
向右键添加新建脚本菜单
查看>>
Office 2010带来的协同工作体验
查看>>
MySQL 常见错误提示
查看>>
Dynamips ADSL实验之一pppoeoa(工大瑞普修正版)
查看>>
SQL Server 2012 Always on Availability Groups安装Step by step 1
查看>>
磁盘及文件操作命令
查看>>
shell 学习之case语句
查看>>
体验async/await异步编程
查看>>
Mac OS Mavericks “本地项目”钥匙串
查看>>
用winhex给自己的文件加把锁
查看>>
烂泥:阿里云RDS本地恢复数据
查看>>