题目链接:P1006 传纸条

PS:伤心,又想不出来,看了大神的题解

AC代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,f[][],a[][];
int main()
{
ll i,j,k;
cin>>n>>m;
for (i=;i<=n;++i)
for (j=;j<=m;++j)
cin>>a[i][j]; f[][]=a[][]+a[][];//不管怎样都会经过(1,2)和(2,1)先赋初值
//i是当前的点横纵坐标之和
//下面的循环是起码2*3或者3*2棋盘才会进入,如果2*2及以下棋盘已经初定义了
for (i=;i<n+m;++i)//至于i<n+m我是画草图才理解的
{
for (j=min(i-,n);j>=;j--) //滚动数组,i层和i-层有关,所以j,k要一直减小而不是增大,防止数据覆盖
{//j=min(i-2,n)是在不超出的情况下找尽量小的能走的位置
for (k=min(i-,n);k>j;k--)
{//k在j右边,所以是i-1
if (j>) //这里的条件判断貌似是不需要的,但加上更好
{
f[j][k]=max(f[j][k],f[j-][k]);
}
if (j>&&k>)
{
f[j][k]=max(f[j][k],f[j-][k-]);
}
if (k->j)//保证移动前的点没有重合
{
f[j][k]=max(f[j][k],f[j][k-]);
}
//对于两个都从上边来的,其实是另一对(j,k)的两个都从左边来,所以不用写了
f[j][k]+=a[j][i-j]+a[k][i-k];//把数字带上
}
}
} cout<<f[n-][n];//输出左下角左边和上边两个格的数字和就好了 return ;
}

点击加号展开代码

谈谈我对这个思路的理解:

1.我们可以看成两纸条同时从左上角原点出发

2.我们发现对于一个画一条条斜线,斜线上的每个点横坐标加纵坐标的和都相同

而且原点到同一条线上任意点要走的距离相同,那么每走一步,纸条a和纸条b都在一条斜线上

为了防止相遇,我们可以假设b的横坐标k永远大于a的横坐标j

而且,我们用i=n+m,那么任意一点的横坐标=i-纵坐标,纵坐标同理,也就是横坐标+纵坐标=i=n+m

3.那我们用i的变化来表示他们现在走到哪条斜线了,

这样一来,就可以开始递推,而且i只和i-1有关系,这是用滚动数组的前提

4.对于数组f[j,k],我们可以看成a走到(j,i-j),b走到(k,i-k)时捡起的总数字

5.然后赋初值,一开始第一步肯定是一个向右,一个向下,所以:

 f[][]=a[][]+a[][];

不管怎样都会经过(1,2)和(2,1)先赋初值

6.循环如何实现

for (i=;i<n+m;++i)//至于i<n+m我是画草图才理解的
for (j=min(i-,n);j>=;j--)
//滚动数组,i层和i-层有关,所以j,k要一直减小而不是增大,防止数据覆盖
//j=min(i-2,n)是在不超出的情况下找尽量小的能走的位置
for (k=min(i-,n);k>j;k--)//k在j右边,所以是i-1

第一维for表示要递推的次数,从4开始是因为如果n,m为1,3就没意义了,而m,n为2,2就已经靠初始化就够了,不需要递推

第二维是考虑纸条a的递推,从大到小是因为每次都要用前面的数据赋值新的数据,所以这样能防止覆盖

第三维和第二维差不多

7.递推式

if (j>)  //这里的条件判断貌似是不需要的,但加上更好
{
f[j][k]=max(f[j][k],f[j-][k]);
}
if (j>&&k>)
{
f[j][k]=max(f[j][k],f[j-][k-]);
}
if (k->j)//保证移动前的点没有重合
{
f[j][k]=max(f[j][k],f[j][k-]);
}
//对于两个都从上边来的,其实是另一对(j,k)的两个都从左边来,所以不用写了

解释以下,这里分别代表

a从左来,b从左来

a从上来,b从左来

a从左来,b从上来

有人回问那两个都从上来去哪了?额,它其实在另外一个地方被算过了,下面上图解释

红色和蓝色表示两个都从上面来,其实他们就等于黄色的那两个地方的两个都从左边来

还有一个地方要注意的是:a从上来,b从左来,这时候要k-1>j,保证移动前的两个点不是重合的

下面上个图解释一下,下图是错误情况

8.输出结果,只要输出当a,b到最右下角那个点的左边和上面的情况的值就好了

老是写不出来DP,自闭了...

NOIP 2008 传纸条(洛谷P1006,动态规划递推,滚动数组)的更多相关文章

  1. 最大子段和(洛谷P1115,动态规划递推)

    洛谷题目链接 题目赋值出来格式有问题,所以我就只放题目链接了 下面为ac代码 #include<bits/stdc++.h> #define ll long long using name ...

  2. P1006 传纸条-洛谷luogu-dp动态规划

    题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个mm行nn列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运 ...

  3. AC日记——传纸条 洛谷 P1006

    题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是 ...

  4. NOIP 2006 金明的预算方案(洛谷P1064,动态规划递推,01背包变形,滚动数组)

    一.题目链接:P1064 金明的预算方案 二.思路 1.一共只有五种情况 @1.不买 @2.只买主件 @3.买主件和附件1(如果不存在附件也要运算,只是这时附件的数据是0,也就是算了对标准的结果也没影 ...

  5. Luogu 1006 传纸条 / NOIP 2008 传纸条(动态规划)

    Luogu 1006 传纸条 / NOIP 2008 传纸条(动态规划) Description 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m ...

  6. noip 2008 传纸条

    题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是 ...

  7. NOIP 2008 传纸条 NOIP 2000 方块取数 多线程DP

    思路都是一样,建立一个四维dp然后跑一发就完了 当然,也可以像我这么帅的人,降成三维再傻傻的跑一发啦啦啦~ #include<iostream> #include<stdio.h&g ...

  8. 最长上升子序列(动态规划递推,LIS)

    1759:最长上升子序列 题目: 总时间限制: 2000ms 内存限制: 65536kB 描述 一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的 ...

  9. 洛谷P1006 NOIP提高组2008 传纸条

    P1006 传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n 列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无 ...

随机推荐

  1. Ubuntu16.04下搭建开发环境及编译tiny4412 Android系统【转】

    本文转载自:http://blog.csdn.net/songze_lee/article/details/72808631 版权声明:本文为博主原创文章,未经博主允许不得转载. 1.安装ssh服务器 ...

  2. POJ 3294 UVA 11107 Life Forms 后缀数组

    相同的题目,输出格式有区别. 给定n个字符串,求最长的子串,使得它同时出现在一半以上的串中. 不熟悉后缀数组的童鞋建议先去看一看如何用后缀数组计算两个字符串的最长公共子串 Ural1517 这道题的思 ...

  3. Tomcat优化和JVM分析工具

    Tomcat的常见优化和JVM常见分析工具 Tomcat的常用优化配置 (1) 内存空间: /etc/sysconfig/tomcat JAVA_OPTS="-server -Xms32g ...

  4. bzoj 3942: [Usaco2015 Feb]Censoring【kmp+栈】

    好久没写kmp都不会写了-- 开两个栈,s存当前串,c存匹配位置 用t串在栈s上匹配,栈每次入栈一个原串字符,用t串匹配一下,如果栈s末尾匹配了t则弹栈 #include<iostream> ...

  5. Extjs grid禁用头部点击三角下拉菜单

    表格头部的三角在点击的时候禁止出现下拉菜单,给每一列添加属性menuDisabled:true xtype:'grid', enableColumnResize:false, columns:[ {t ...

  6. org.apache.poi.hssf.util.Region

    从POI 3.18开始被Deprecated,在3.20版本中被移除了,所以3.20以前的都有 为了避免这个问题,用CellRangeAddress代替Region,其用法相同

  7. jQuery——修改网页字体大小

    HTML: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <lin ...

  8. spring 简单实现BeanFactory(转)

    原文地址: http://blog.csdn.net/mlc1218559742/article/details/52776160 有没有发现上面的代码与利用反射实现工厂模式的代码很相似.对,你没有看 ...

  9. spring 嵌套事务问题

    嵌套事物总结 事物成功总结 1.内外都无try Catch的时候,外部异常,全部回滚. 2.内外都无try Catch的时候,内部异常,全部回滚. 3.外部有try Catch时候,内部异常,全部回滚 ...

  10. 图论 HDOJ 5348 MZL's endless loop

    题目传送门 /* 题意:给一个n个点,m条边的无向图,要求给m条边定方向,使得每个定点的出入度之差的绝对值小于等于1. 输出任意一种结果 图论:一个图,必定存在偶数个奇度顶点.那么从一个奇度定点深搜, ...