博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[ CodeVS冲杯之路 ] P1169
阅读量:4981 次
发布时间:2019-06-12

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

  不充钱,你怎么AC?

  题目:

 

  感觉这题目好恐怖,莫名其妙乱码一堆就AC了……

  它看上去是两个子问题,实际上可以看成从起点找两条不相交的路径使得经过的数和最大

  用 f[i][j][k][l] 表示第一条走到了 (i,j) 第二条走到了 (k,l)

  

  目标状态是 f[n][m-1][n-1][m]

  一开始我也没仔细去想,就莫名其妙码了一堆交上去了,本以为会WA,结果A了?!

  后面我仔细证明了一下,它是这样的

  首先 l 是从 j+1 开始的,这个点非常关键,它控制住列下标,永远会比 j 大,也就是第二条线始终在第一条的右边,这就保证了两线不相交

  但是它会从 [l-1] 转移过来,也就是从 j=l 的地方转移,不过这没有关系,因为 j=l 的状态永远是 0,因为循环的时候根本不会使 j=l

  因为终点的分数是 0,所以目标状态就是终点左边和上面的两个点

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 using namespace std; 8 9 int f[51][51][51][51],n,a[51][51],m;10 int main()11 {12 scanf("%d%d",&n,&m);13 int i,j,k,l;14 for (i=1;i<=n;i++)15 for (j=1;j<=m;j++) scanf("%d",&a[i][j]);16 for (i=1;i<=n;i++)17 for (j=1;j<=m;j++)18 for (k=1;k<=n;k++)19 for (l=j+1;l<=m;l++) f[i][j][k][l]=max(max(f[i][j-1][k-1][l],f[i-1][j][k][l-1]),max(f[i][j-1][k][l-1],f[i-1][j][k-1][l]))+a[i][j]+a[k][l];20 printf("%d\n",f[n][m-1][n-1][m]);21 return 0;22 }

 

转载于:https://www.cnblogs.com/hadilo/p/5904293.html

你可能感兴趣的文章
Perl/Nagios – Can’t locate utils.pm in @INC
查看>>
Javascript 有用参考函数
查看>>
【转】Simulink模型架构指导
查看>>
[转载]java开发中的23种设计模式
查看>>
揭秘:黑客必备的Kali Linux是什么,有哪些弊端?
查看>>
linux系统的远程控制方法——学神IT教育
查看>>
springboot+mybatis报错Invalid bound statement (not found)
查看>>
Linux环境下SolrCloud集群环境搭建关键步骤
查看>>
MongoDB的简单使用
查看>>
【noip2004】虫食算——剪枝DFS
查看>>
java小技巧
查看>>
POJ 3204 Ikki's Story I - Road Reconstruction
查看>>
SQL中Group By的使用
查看>>
两个表格中数据不用是一一对应关系--来筛选不同数据,或者相同数据
查看>>
js05-DOM对象二
查看>>
mariadb BINLOG_FORMAT = STATEMENT 异常
查看>>
Java回顾之多线程
查看>>
2018 Multi-University Training Contest 10 - Count
查看>>
HDU6203 ping ping ping
查看>>
Fireworks基本使用
查看>>