题目大意:一个$N\times N$的阵列,每个格子有$X_{ij}$个调和之音,若每次只能选择走右边或下边,从左上角出发走到右下角,问最多能收集到多少个调和之音?
 
      这题是一道很很很简单的DP题,但可能之前没接触过的同学需要一点脑能量去思考。。如果用最蠢的办法,循环枚举每种选择,求出最大值的话,由于你总共需要往右走$N-1$次,往下走$N-1$次,路径总长度为$2N-2$,根据组合数学,总共有$C_{2N-2}^{N-1}$种走法,想想$C_{1998}^{999}$会是一个多么可怕的数字,不用说这铁定是会超时的,而且铁定会超到地老天荒。怎么办呢?
 
      有的同学可能会考虑:能不能用贪心算法做呢?即每次只有两个选择,我每次都选择最大的那个,那么最终得到的结果是否在整体上是最大的呢?很遗憾这是错的,因为你每次只能往右或往下走,走当前的最大步无法证明走过最小步后,不会产生一条更大的路径。以上两种方案详细的分析参见51Nod - 动态规划入门篇 - 矩阵取数问题(注意先注册登录)。
 
      因此这题非DP不可了,考虑当前格子$X_{ij}$,它要么从$X_{i-1,j}$走过来,要么从$X_{i,j-1}$走过来,因此我只需要做两次循环,给每个格子判断一下从左边来的值更大,还是从上边来的值更大,然后跟这个格子的值相加,这样对于每个格子来说,它的值一定是从左上角到这个格子的最大值。在读入数据的时候就可以计算了。时间复杂度$O(N^2)$,空间复杂度$O(N^2)$。
 #include <stdio.h>

 inline int max(int&a, int&b) {
return a>b?a:b;
} int T, N, mat[][];
int main() {
scanf("%d", &T);
while(T--) {
scanf("%d", &N);
for(int i=; i<=N; i++)
for(int j=; j<=N; j++) {
scanf("%d", mat[i]+j);
mat[i][j]+=max(mat[i-][j], mat[i][j-]);
}
printf("%d\n", mat[N][N]);
}
return ;
}
 
      然后我们再想想,空间复杂度$O(N^2)$其实是没必要哒!因为给每个格子判断只会用到它左边和上边的格子,也就是说只需要保存上一行就行了,判断完这一行的格子就可以覆盖掉了,上两行以上根本没必要保留,因为我们只要求最大值,不是求产生的最大值的路径,因此没必要保存下来(这是ACM中的滚动数组技术)。于是空间复杂度愉快地降到了$O(N)$。
 #include <stdio.h>

 inline int max(int&a, int&b) {
return a>b?a:b;
} int T, N, mat[], x;
int main() {
scanf("%d", &T);
while(T--) {
scanf("%d", &N);
for(int i=; i<=N; i++)
mat[i]=;
for(int i=; i<=N; i++)
for(int j=; j<=N; j++) {
scanf("%d", &x);
mat[j]=max(mat[j-], mat[j])+x;
}
printf("%d\n", mat[N]);
}
return ;
}
 
      比较遗憾的是,现场没有多少人能够做出来这道简单DP题,如果模仿去年新生赛决赛其中一题的难度,即求到终点对某个数$P$取模的最大值的话,估计会更惨。。。。

——by BlackStorm, from herehttp://www.cnblogs.com/BlackStorm/p/5043638.html .

SCNU 2015ACM新生赛决赛【F. Oyk闯机关】解题报告的更多相关文章

  1. SCNU 2015ACM新生赛初赛【1007. ZLM的扑克牌】解题报告

            题目链接详见SCNU 2015新生网络赛 1007. ZLM的扑克牌 .         其实我在想这题的时候,还想过要不要设置求最小的排列,并且对于回文数字的话,可以把扑克牌折起来( ...

  2. SCNU 2015ACM新生赛初赛【1006. 3D打印】解题报告

            题目链接详见SCNU 2015新生网络赛 1006. 3D打印 .出题思路来自codevs 3288. 积木大赛,属于模拟题.         首先我们把“选择从第L部分到第R部分”理 ...

  3. SCNU 2015ACM新生赛初赛【1001~1011】个人解题思路

            题目1001:       大意:已知$n$个角色,$m$种怪物种族,$k$个怪物,给出一组角色编号,编号$P_{i}$的角色能肝死编号$i$的怪物,对于给定的一组怪物编号,为了打通关 ...

  4. SCNU ACM 2016新生赛决赛 解题报告

    新生初赛题目.解题思路.参考代码一览 A. 拒绝虐狗 Problem Description CZJ 去排队打饭的时候看到前面有几对情侣秀恩爱,作为单身狗的 CZJ 表示很难受. 现在给出一个字符串代 ...

  5. 2021广东工业大学新生赛决赛 L-歪脖子树下的灯

    题目:L-歪脖子树下的灯_2021年广东工业大学第11届腾讯杯新生程序设计竞赛(同步赛) (nowcoder.com) 比赛的时候没往dp这方面想(因为之前初赛和月赛数学题太多了啊),因此只往组合数学 ...

  6. 2013级新生程序设计基础竞赛-正式赛 F 异或最大值 解题报告

    F - 异或最大值 Time Limit: 2000/1000MS (Java/Others)      Memory Limit: 128000/64000KB (Java/Others) Subm ...

  7. 安徽师大附中%你赛day6 T3 Hamsters [POI2010]CHO-Hamsters 解题报告

    [POI2010]CHO-Hamsters 题意: 给出n个互不包含的字符串,要求你求出一个最短的字符串S,使得这n个字符串在S中总共至少出现m次,问S最短是多少? 范围: \(1 \le n \le ...

  8. 【HHHOJ】ZJOI2019模拟赛(十三)03.10 解题报告

    点此进入比赛 得分: \(97+0+10=107\) 排名: \(Rank\ 3\) \(Rating\):\(+47\) \(T1\):[HHHOJ187]Hashit(点此看题面) 容易想到可以用 ...

  9. 【HHHOJ】NOIP2018 模拟赛(二十五) 解题报告

    点此进入比赛 得分: \(100+100+20=220\)(\(T1\)打了两个小时,以至于\(T3\)没时间打了,无奈交暴力) 排名: \(Rank\ 8\) \(Rating\):\(+19\) ...

随机推荐

  1. 【Win 10 应用开发】透视效果

    所谓透视效果,就是在平面坐标空间上模拟出“好像”三维的效果.要是老周没有记错的话,以前在写WP8相关的内容时写过,UWP中的透视方法也保留了以前的Do法,其实这玩意儿是从 Silverlight 沿袭 ...

  2. Node+fs+定时器(node-schedule)+MySql

    目标:将本人写博客时候的截图保存到桌面的图片 执行保存到指定文件进行整理 并写入数据库 先看最终的目录结构: package.json文件: { "name": "zqz ...

  3. Mono的简单例子

    一直对移动端开发有些兴趣,但苦于不会Java,好在终于找到了个好玩的. 安装方法略了,先建立一个玩玩 不多说,贴代码了,需要注意的只有些JAVA和C#写法不太一样的地方,不细介绍了,因为没什么经验,乱 ...

  4. 原生JS实现"旋转木马"效果的图片轮播插件

    一.写在最前面 最近都忙一些杂七杂八的事情,复习软考.研读经典...好像都好久没写过博客了... 我自己写过三个图片轮播,一个是简单的原生JS实现的,没有什么动画效果的,一个是结合JQuery实现的, ...

  5. Cesium原理篇:5最长的一帧之影像

    如果把地球比做一个人,地形就相当于这个人的骨骼,而影像就相当于这个人的外表了.之前的几个系列,我们全面的介绍了Cesium的地形内容,详见: Cesium原理篇:1最长的一帧之渲染调度 Cesium原 ...

  6. UED双飞翼布局

    <style> body,html { height:%; padding: ; margin: } .main { background: #f2f2f2; width: %; floa ...

  7. dicom网络通讯入门(1)

    看标准 越看越糊,根本原因:dicom抽象得非常严重,是“专家”弄的.没办法. 又是什么服务类 又是什么sop,相信你把dicom标准看到头大 都不知如何下手. 不就是 socket么 这有何难. 首 ...

  8. 初识Hadoop

    第一部分:              初识Hadoop 一.             谁说大象不能跳舞 业务数据越来越多,用关系型数据库来存储和处理数据越来越感觉吃力,一个查询或者一个导出,要执行很长 ...

  9. Java判断字符串是否是数值

    判断一个字符串是否是数值,可以用正则表达式来判断.更简单的方法是把字符串转换成Float或者Double,然后捕捉NumberFormatException错误,如果有错误,就说明不是一个数值,如果没 ...

  10. Java全角、半角字符的关系以及转换

    如果搞明白了Java中全角字符和半角字符之间的关系,那他们之间的转换就不是个麻烦事儿.你只需要对这个关系有那么一个印象就足够了. 全角字符与半角字符的关系 通过下面的代码能看到Java中所有字符以及对 ...