题目大意:一个$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. 【WPF】运用MEF实现窗口的动态扩展

    若干年前,老周写了几篇有关MEF的烂文,简单地说,MEF是一种动态扩展技术,比如可以指定以某个程序集或某个目录为搜索范围,应用程序在运行时会自动搜索符合条件的类型,并自动完成导入,这样做的好处是,主程 ...

  2. react+redux教程(六)redux服务端渲染流程

    今天,我们要讲解的是react+redux服务端渲染.个人认为,react击败angular的真正“杀手锏”就是服务端渲染.我们为什么要实现服务端渲染,主要是为了SEO. 例子 例子仍然是官方的计数器 ...

  3. [收藏]IntelliJ Idea快捷键

    Alt+回车 导入包,自动修正 Ctrl+N 查找类 Ctrl+Shift+N 查找文件 Ctrl+Alt+L 格式化代码 Ctrl+Alt+O 优化导入的类和包 Alt+Insert 生成代码(如g ...

  4. Java进击C#——开发环境

    在进入本章之前.笔者想说一些话.对于笔者来讲语言没有好坏之分.只有适不适用之别.当上一篇发到首页的时候,我突然发现有可能会引发争论.这是笔者担心的,这也是笔者不想看到的. 笔者想写这一系列的原因不是为 ...

  5. ASP.NET MVC5----了解我们使用的@HTML帮助类

    20几岁,怕什么. 自己的感觉 说一个自己最近使用AngularJS的感受,我们之前使用mvc进行项目开发都是了解和经常使用HTML的帮助类,来完成我们前端大部分代码的编写,其实在我没有接触Angul ...

  6. 学习EF之贪婪加载和延迟加载(1)

    从暑假开始接触code first以来,一直感觉很好用,主要在于开发过程中以业务为中心可以随时修改数据模型生成数据库,还有一个原因就是查询起来很方便 这里找了一个以前database first的一段 ...

  7. .NET Core 1.1 发布 文档下载资源汇总

    .NET Core 1.1 RTM 版2016/11/16 发布.对应发布 ASP.NET Core 1.1 .EF Core 1.1. 你可以通过Visual Studio 2015, Visual ...

  8. C#多线程--线程池(ThreadPool)

    先引入一下线程池的概念: 百度百科:线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务.线程池线程都是后台线程.每个线程都使用默认的堆栈大小,以默认的优先级运行, ...

  9. 一个java文件中可包含多个main方法

    java中的main方法是java应用程序的入口,java程序在运行时,首先调用执行main方法.但并不是说java中只能有一个main方法,不同类中都可以包含main方法.当JVM进行编译时,会提示 ...

  10. SpringBootService,一个基于spring boot搭建的SOA服务框架

    SpringBootService,这是一个spring boot微服务的框架,包括redis,mq,restful,定时器,mybatis.易扩容.易维护的架构. 项目说明 该项目使用maven进行 ...