题目链接:http://codeforces.com/problemset/problem/762/D

题意:给出一个3*n的矩阵然后问从左上角到右下角最大权值是多少,而且每一个点可以走上下左右,但是一个点

不能被经过两次及以上。

题解:一看感觉是一道插头dp但是,由于只是3 * n的矩阵,所以必定有规律。然而规律也挺好找的。只要往回走必定会取完3行。

而且走法都有规律的最好自行画图理解一下。

#include <iostream>
#include <cstring>
#define inf 1000000000000000
using namespace std;
const int M = 1e5 + 10;
long long a[4][M];
long long dp[M][4];
long long sum(int pos , int l , int r) {
if(l > r) {
swap(l , r);
}
long long sum = 0;
for(int i = l ; i <= r ; i++) {
sum += a[i][pos];
}
return sum;
}
int main() {
int n;
cin >> n;
for(int i = 0 ; i < 3 ; i++) {
for(int j = 1 ; j <= n ; j++) {
cin >> a[i][j];
}
}
for(int i = 0 ; i <= n ; i++) {
for(int j = 0 ; j <= 3 ; j++) {
dp[i][j] = -inf;
}
}
dp[0][0] = 0;
for(int i = 1 ; i <= n ; i++) {
for(int j = 0 ; j < 3 ; j++) {
for(int k = 0 ; k < 3 ; k++) {
dp[i][j] = max(dp[i][j] , dp[i - 1][k] + sum(i , j , k));
}
}
dp[i][0] = max(dp[i][0] , dp[i - 1][3] + sum(i , 0 , 2));
dp[i][2] = max(dp[i][2] , dp[i - 1][3] + sum(i , 0 , 2));
dp[i][3] = max(dp[i][3] , max(dp[i - 1][0] , dp[i - 1][2]) + sum(i , 0 , 2));
}
cout << dp[n][2] << endl;
return 0;
}

最新文章

  1. MySQL学习笔记九:存储过程,存储函数,触发器
  2. STL之list
  3. es6 const
  4. Daily Scrum – 1/12
  5. ES6中的const命令
  6. 怎么在logcat中显示system.com.print中的打印信息
  7. [转]网站优化-IIS7下静态文件的优化
  8. [转载]MongoDB设置访问权限、设置用户
  9. POJ_2503_Babelfish_(Trie/map)
  10. Android 设计随便说说之简单实践(模块划分)
  11. 运用Unity结合PolicyInjection实现拦截器
  12. php 数组合并方法
  13. leetcode-006 detect cycle
  14. dubbo-admin和dubbo-monitor的安装
  15. checkbox事件的变化
  16. 企业级仓库harbor搭建
  17. 【mmall】递归查询子节点并排重
  18. [UE4]C++中的注释
  19. flask 之cbv ,flash闪现,Flask_Session,WTForms - MoudelForm
  20. 20155210 Exp9 Web安全基础实践

热门文章

  1. 【Spring源码解析】—— 委派模式的理解和使用
  2. 为什么阿里Java规约禁止使用Java内置线程池?
  3. 四、Python基础(1)
  4. 【Java例题】5.3 字符统计
  5. 深扒JVM,对它进行“开膛破肚”式解析!
  6. TensorFlow Data模块
  7. java中String,StringBuffer,StringBuilder的区别
  8. 在一个jsp页面内实现简单计算器
  9. 清缓存的姿势不对,真的会出生产bug哦
  10. 图数据库 Nebula Graph 的数据模型和系统架构设计