*51nod 1409
https://blog.csdn.net/stay_accept/article/details/81476358
不懂啊
#include <map>
#include <queue>
#include <string>
#include <math.h>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
inline bool scan_d(int &num) {
char in;
bool IsN=false;
in=getchar();
if(in==EOF) return false;
while(in!='-'&&(in<''||in>'')) in=getchar();
if(in=='-') {
IsN=true;
num=;
} else num=in-'';
while(in=getchar(),in>=''&&in<='') {
num*=,num+=in-'';
}
if(IsN) num=-num;
return true;
}
const int siz=;
int a[siz][siz];
long long g[siz],dp[][siz][];
int main() {
long long ans;
int n,m,i,j,k,x,y,op;
while(scanf("%d%d",&n,&m)!=EOF) { //dp[i][j][k]表示到dii列第j行向上走还是向下走
for(i=; i<=n; i++)
for(j=; j<=m; j++)
scan_d(a[i][j]);
for(i=; i<=n; i++)
dp[][i][]=dp[][i][]=;
for(i=; i<=m; i++) {
x=i&,y=-(i&);
for(j=; j<=n; j++)
dp[x][j][]=dp[x][j][]=-;
dp[x][][]=dp[x][][]=;
dp[x][n+][]=dp[x][n+][]=;
for(j=; j<=n; j++) {
if(a[j][i]==-)
continue;
for(k=; k<=; k++) {
if(dp[y][j][k]!=-)
dp[x][j][]=max(dp[x][j][],dp[y][j][k]+a[j][i]);
if(dp[y][j][k]!=-)
dp[x][j][]=max(dp[x][j][],dp[y][j][k]+a[j][i]);
}
} //先算出从前一列过来的得分
for(j=; j<=n; j++) {
if(dp[x][j-][]!=-&&a[j][i]!=-)
dp[x][j][]=max(dp[x][j][],dp[x][j-][]+a[j][i]);
} //然后本列进行转移
for(j=; j<=n; j++)
g[j]=-;
g[]=;
if(dp[x][n][]!=-) { //算出经过传送门的得分
op=n; //想下走就找尽可能往下更新的点
while(op>) {
if(dp[x][op][]==dp[x][op-][]+a[op][i]&&dp[x][op-][]!=-)
op--;
else
break;
}
for(j=; j<op; j++) {
if(a[j][i]==-)
break;
g[j]=g[j-]+a[j][i];
}
} //往上走跟往下走是一样的思路
for(j=; j<n; j++)
dp[x][j][]=max(dp[x][j][],g[j]);
for(j=n-; j>=; j--) {
if(dp[x][j+][]!=-&&a[j][i]!=-)
dp[x][j][]=max(dp[x][j][],dp[x][j+][]+a[j][i]);
}
for(j=; j<=n; j++)
g[j]=-;
g[n+]=;
if(dp[x][][]!=-) {
op=;
while(op<n) {
if(dp[x][op][]==dp[x][op+][]+a[op][i]&&dp[x][op+][]!=-)
op++;
else
break;
}
for(j=n; j>op; j--) {
if(a[j][i]==-)
break;
g[j]=g[j+]+a[j][i];
}
}
for(j=n; j>; j--)
dp[x][j][]=max(dp[x][j][],g[j]);
}
ans=-;
for(i=; i<=n; i++)
ans=max(ans,max(dp[m&][i][],dp[m&][i][]));
printf("%I64d\n",ans);
}
return ;
}
*51nod 1409的更多相关文章
- 【51Nod 1244】莫比乌斯函数之和
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 模板题... 杜教筛和基于质因子分解的筛法都写了一下模板. 杜教筛 ...
- 51Nod 1268 和为K的组合
51Nod 1268 和为K的组合 1268 和为K的组合 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 给出N个正整数组成的数组A,求能否从中选出若干个,使 ...
- 51Nod 1428 活动安排问题
51Nod 1428 活动安排问题 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1428 1428 活 ...
- 51Nod 1278 相离的圆
51Nod 1278 相离的圆 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1278 1278 相离的圆 基 ...
- 【51Nod 1501】【算法马拉松 19D】石头剪刀布威力加强版
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1501 dp求出环状不连续的前缀和,剩下东西都可以算出来,比较繁琐. 时间 ...
- 【51Nod 1622】【算法马拉松 19C】集合对
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1622 简单题..直接暴力快速幂 #include<cstdio&g ...
- 【51Nod 1616】【算法马拉松 19B】最小集合
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1616 这道题主要是查询一个数是不是原有集合的一个子集的所有数的gcd. ...
- 【51Nod 1674】【算法马拉松 19A】区间的价值 V2
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1674 对区间分治,统计\([l,r]\)中经过mid的区间的答案. 我的 ...
- 随便玩玩系列之一:SPOJ-RNG+51nod 算法马拉松17F+51nod 1034 骨牌覆盖v3
先说说前面的SPOJ-RNG吧,题意就是给n个数,x1,x2,...,xn 每次可以生成[-x1,x1]范围的浮点数,把n次这种操作生成的数之和加起来,为s,求s在[A,B]内的概率 连续形的概率 假 ...
随机推荐
- MongoDB journal 与 oplog,究竟谁先写入?--转载
MongoDB journal 与 oplog,谁先写入?最近经常被人问到,本文主要科普一下 MongoDB 里 oplog 以及 journal 这两个概念. journal journal 是 M ...
- 【闭包】Pants On Fire
Pants On Fire 题目描述 Donald and Mike are the leaders of the free world and haven’t yet (after half a y ...
- Dubbo#编译动态扩展类
这篇排版有问题 后面修改....**** 以ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();为例 - ...
- 项目element-ui checkbox里面获取选中项 实现批量删除 修改
<el-table :data="tableData" stripe border style="width: 100%" @selection-chan ...
- python实现数字0开始的索引,对应Execl的字母方法
字母转数字方法: import re col = row = [] # 输入正确格式的定位,A2,AA2有效,AAB2无效 while len(col) == 0 or len(row) == 0 o ...
- Git 常用命令 MD
| Markdown版本笔记 | 我的GitHub首页 | 我的博客 | 我的微信 | 我的邮箱 || :------------: | :------------: | :------------: ...
- 浅谈C++继承
C++中的继承 1.继承概念及定义: 概念:是面向对象程序设计使代码可以复用的最重要的手段-----继承是类设计层次的复用 定义: 父类->基类:子类-&g ...
- (五)Activiti之获取流程定义图片和流程定义删除
一.获取流程定义图片 /** * 通过流程部署ID获取流程图图片 */ @Test public void getImageById()throws Exception{ InputStream in ...
- C# List<> Find相关接口学习
参考 http://blog.csdn.net/daigualu/article/details/54315564 示例: List<int> test = new List<int ...
- 解决input获取焦点时底部菜单被顶上来问题
<div class="search-box"> <input class="search-input" type="text&qu ...