[hdu 2686]Matrix
网上说这道题的题解是费用流
我粗粗看了一下数据范围,觉得出题者似乎是让我们用 “大(d)屁(p)” 的样子,为了尊重出题人,我还是写一写吧喵~
首先,一条回路可以看做是两条路齐头并进,这是 大屁 和 费永柳 的共同思想
故我们可用一条条次对角线(即 x+y=k 的对角线)来划分状态
考虑枚举对角线上两个点 x1,y1,x2,y2
很大力地用 f[x1][y1][x2][y2] 表示两条路分别走到 点(x1, y1)和 点(x2, y2)时的最佳方案
这样 f[x1][y1][x2][y2] 就可以由 f[x1-1][y1][x2-1][y2], f[x1-1][y1][x2][y2-1], f[x1][y1-1][x2-1][y2], f[x1][y1-1][x2][y2-1] 来得到(丧心病狂)
还有当 点(x1, y1)和 点(x2, y2)在对角线上相邻时情况特殊,因为 点(x1-1, y1)和 点(x2, y2-1)重合了,需要特别考虑(真是丧心病狂)
虽然看上去很恶心,但我觉得再怎么说短也是一大优势,你的费用流有这么短喵?
#include <cstdio>
#include <cstring>
#define max(x, y) ((x)>(y) ? (x):(y))
const int size=32; int n;
int a[size][size];
int f[size][size][size][size];
inline int getint();
inline void putint(int); int main()
{
while (scanf("%d", &n)!=EOF)
{
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
a[i][j]=getint();
memset(f, 0, sizeof f);
f[2][1][1][2]=a[1][1]+a[1][2]+a[2][1];
for (int i=4;i<2*n;i++)
for (int y1=i<=n+1?1:i-n;y1<i-1 && y1<n;y1++)
for (int y2=y1+1;y2<i && y2<=n;y2++)
{
int x1=i-y1, x2=i-y2;
if (y2-y1==1) f[x1][y1][x2][y2]=max(max(f[x1][y1-1][x2][y1], f[x2][y1][x2-1][y2]), f[x1][y1-1][x2-1][y2]);
else f[x1][y1][x2][y2]=max(max(f[x1-1][y1][x2-1][y2], f[x1-1][y1][x2][y2-1]), max(f[x1][y1-1][x2-1][y2], f[x1][y1-1][x2][y2-1]));
f[x1][y1][x2][y2]+=a[x1][y1]+a[x2][y2];
}
putint(a[n][n]+f[n][n-1][n-1][n]);
} return 0;
}
inline int getint()
{
register int num=0;
register char ch;
do ch=getchar(); while (ch<'0' || ch>'9');
do num=num*10+ch-'0', ch=getchar(); while (ch>='0' && ch<='9');
return num;
}
inline void putint(int num)
{
char stack[15];
register int top=0;
for ( ;num;num/=10) stack[++top]=num%10+'0';
for ( ;top;top--) putchar(stack[top]);
putchar('\n');
}
[hdu 2686]Matrix的更多相关文章
- HDU 2686 Matrix 3376 Matrix Again(费用流)
HDU 2686 Matrix 题目链接 3376 Matrix Again 题目链接 题意:这两题是一样的,仅仅是数据范围不一样,都是一个矩阵,从左上角走到右下角在从右下角走到左上角能得到最大价值 ...
- hdu 2686 Matrix 最小费用最大流
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2686 Yifenfei very like play a number game in the n*n ...
- HDU 2686 Matrix 多线程dp
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2686 思路:多线程dp,参考51Nod 1084:http://www.51nod.com/onlin ...
- HDU 2686 Matrix(最大费用最大流+拆点)
题目链接:pid=2686">http://acm.hdu.edu.cn/showproblem.php?pid=2686 和POJ3422一样 删掉K把汇点与源点的容量改为2(由于有 ...
- HDU 2686 Matrix(最大费用流)
Matrix Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- hdu 2686 Matrix && hdu 3367 Matrix Again (最大费用最大流)
Matrix Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- POJ 2135 Farm Tour && HDU 2686 Matrix && HDU 3376 Matrix Again 费用流求来回最短路
累了就要写题解,近期总是被虐到没脾气. 来回最短路问题貌似也能够用DP来搞.只是拿费用流还是非常方便的. 能够转化成求满流为2 的最小花费.一般做法为拆点,对于 i 拆为2*i 和 2*i+1.然后连 ...
- HDU 4920 Matrix multiplication(bitset)
HDU 4920 Matrix multiplication 题目链接 题意:给定两个矩阵,求这两个矩阵相乘mod 3 思路:没什么好的想法,就把0的位置不考虑.结果就过了.然后看了官方题解,上面是用 ...
- (多线程dp)Matrix (hdu 2686)
http://acm.hdu.edu.cn/showproblem.php?pid=2686 Problem Description Yifenfei very like play a num ...
随机推荐
- hdu4057Rescue the Rabbit(ac自动机+dp)
链接 当时是因为没有做出来这道题才开了自动机的专题,现在看看还是比较简单的. 因为每个病毒串只算一次,只有10个病毒串,可以状压一下哪些状态是可以达到的,最后取一个最大值. #include < ...
- (六)makefile编程
最简单的makefile: all: gcc server.c -o ser gcc client.c -o cli clear: rm ser cli *.o -rf #rm -rf表示删除文件 ...
- 页面加载后resize页面布局
在我们写web的时候,有的时候页面加载完以后,布局位置有一些问题,手动改变窗口大小后则正常显示位置. 其实,我们手动改变窗口大小,是执行了resize方法. share一下兼容方法: coffee c ...
- 根据屏幕的宽度使用不同的css-文件
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 关于OPencv版本不符合,相关库变化问题
由于OPencv发展迅速,已经省略了很多原来的库文件,奈何自己才疏学浅,所以只能把OPencv 1.0中的相关版本中的库文件一直过去. 链接: http://pan.baidu.com/s/1qY1Z ...
- iOS开发技巧
一.寻找最近公共View 我们将一个路径中的所有点先放进 NSSet 中.因为 NSSet 的内部实现是一个 hash 表,所以查找元素的时间复杂度变成了 O(1),我们一共有 N 个节点,所以总时间 ...
- WebView注入Java对象注意事项
在android4.2以前,注入步骤如下: webview.getSetting().setJavaScriptEnable(true); class JsObject { public String ...
- WEB UI 整理
当下对于网站前段开发人员来说,很少有人不使用一些JS框架或者WEB UI库,因此这些可以有效提高网站前段开发速度,并且能够统一开发环境,对于不同浏览器的兼容性也不需要程序员操心,有了这些优点,当然大家 ...
- 求解,ASP.Net MVC Redirect 无法跳转问题
①JS代码 $.post("/Home/CheckLogin", { "username": $("#username").val(), & ...
- Java:多线程<四> Lock、停止线程、守护线程、join、优先级&yield
Java1.5以后,Condition将Object监视器方法(wait, notify, notifyAll)分解成截然不同的对象,以便通过这些对象与任意Lock实现组合使用为每个对像提供多个等待s ...