博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CF B. Working out
阅读量:2125 次
发布时间:2019-04-30

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

题意

给一个矩阵每个位置一个value,求从左上角到右下角和左下角到右上角value和,相交的地方value不计,问和最大多少

AC

  • 分别求出每个点四个方向的value和
  • 每个点可以有四种走法,满足情况的只有两种(可画图模拟)
#include 
#define ll long long#define N 100005#define mem(a, b) memset(a, b, sizeof(a))#define P pair
using namespace std;int dp[1005][1005][4];int a[1005][1005];int main() { // freopen("in.txt", "r", stdin); int r, c; while(cin >> r >> c) { mem(dp, 0); for (int i = 1; i <= r; ++i) { for (int j = 1; j <= c; ++j) { cin >> a[i][j]; } } for (int i = 1; i <= r; ++i) { // 右下 for (int j = 1; j <= c; ++j) { dp[i][j][0] = max(dp[i - 1][j][0], dp[i][j - 1][0]) + a[i][j]; } // 左下 for (int j = c; j >= 1; --j) { dp[i][j][1] = max(dp[i - 1][j][1], dp[i][j + 1][1]) + a[i][j]; } } for (int i = r; i >= 1; --i) { // 右上 for (int j = 1; j <= c; ++j) { dp[i][j][2] = max(dp[i][j - 1][2], dp[i + 1][j][2]) + a[i][j]; } // 左上 for (int j = c; j >= 1; --j) { dp[i][j][3] = max(dp[i + 1][j][3], dp[i][j + 1][3]) + a[i][j]; } } int ans = 0; for (int i = 2; i < r; ++i) { for (int j = 2; j < c; ++j) { ans = max(ans, dp[i - 1][j][0] + dp[i + 1][j][3] + dp[i][j - 1][2] + dp[i][j + 1][1]); ans = max(ans, dp[i - 1][j][1] + dp[i + 1][j][2] + dp[i][j - 1][0] + dp[i][j + 1][3]); } } cout << ans << endl; } return 0;}

转载地址:http://gzprf.baihongyu.com/

你可能感兴趣的文章
Oracle数据库中的(+)连接
查看>>
java-oracle中几十个实用的PL/SQL
查看>>
PLSQL常用方法汇总
查看>>
详细介绍Oracle sqlplus命令
查看>>
几个基本的 Sql Plus 命令 和 例子
查看>>
PLSQL单行函数和组函数详解
查看>>
Oracle PL/SQL语言初级教程之异常处理
查看>>
Oracle PL/SQL语言初级教程之游标
查看>>
Oracle PL/SQL语言初级教程之操作和控制语言
查看>>
Oracle PL/SQL语言初级教程之过程和函数
查看>>
Oracle PL/SQL语言初级教程之表和视图
查看>>
Oracle PL/SQL语言初级教程之完整性约束
查看>>
PL/SQL学习笔记
查看>>
如何分析SQL语句
查看>>
结构化查询语言(SQL)原理
查看>>
SQL教程之嵌套SELECT语句
查看>>
几个简单的SQL例子
查看>>
日本語の記号の読み方
查看>>
计算机英语编程中一些单词
查看>>
JavaScript 经典例子
查看>>