题意:

给定两个矩阵,第一个矩阵代表时间,第二个矩阵代表距离。给出约束的公式,询问在每一行都造一个圣光塔最少花费多少时间!

思路:

对于题目中给的条件 |J-K| <=f[i][j] +f[i+1] [k] 若拆掉绝对值可以得到 K+f[i+1][k] >= j- f[i] [j]        k-f[i+1][k] <= j+f[i][j]

若M很小的话 ,我们自然可以通过一个很好看出来的 DP来AC 。DP的方程为:

dp[i ][ j] = min(  dp[i ] [j]  , dp[i-1] [k ] + timed[ i] [j] )  ,但是如果我们暴力枚举的话是m*m *n 的复杂度,显然会TLE

再重新考虑不等式约束,可以发现K的范围只是在 j-f[i][j]  ,f+ f[i][j]之间 ,也就是我们每次DP转移方程 是在这个范围内取得最小值。

对于这个问题显然线段树就可以搞定!维护区间最小值

#include<algorithm>
#include<iostream>
#include<sstream>
#include<string.h>
#include<stdio.h>
#include<math.h>
#include<vector>
#include<string>
#include<queue>
#include<map>
using namespace std;
const int inf=0x3f3f3f3f;
int n,m,ans;
const int maxn=5005;
int timed[105][maxn];
int dp[105];
int f[105][maxn];
struct node
{int left,right;int minn,val;
}tree[maxn*4];
void build(int i,int left,int right)
{tree[i].left=left,tree[i].right=right;tree[i].minn=inf,tree[i].val=inf ;if(left==right) return;int mid=(left+right)>>1;build(i<<1,left,mid);build(i<<1|1,mid+1,right);return ;
}
void pushdown(int i)
{int mid=tree[i].left+tree[i].right;mid=mid>>1;tree[i<<1].val=  min(tree[i<<1].val,tree[i].val);tree[i<<1|1].val=min(tree[i<<1|1].val,tree[i].val);tree[i<<1].minn=  min(tree[i<<1].minn,tree[i].val);tree[i<<1|1].minn=min(tree[i<<1|1].minn,tree[i].val);tree[i].val=inf;
}
void update(int i,int left,int right,int w)
{if(tree[i].left==left&&tree[i].right==right){tree[i].val=min(tree[i].val,w);tree[i].minn=min(tree[i].minn,w);return ;}if(tree[i].val!=inf){pushdown(i);}int mid=(tree[i].left+tree[i].right)>>1;if(right<=mid)update(i<<1,left,right,w);else if(left>mid)update(i<<1|1,left,right,w);else{update(i<<1,left,mid,w);update(i<<1|1,mid+1,right,w);}tree[i].minn=min(tree[i<<1].minn,tree[i<<1|1].minn);return ;
}
void query(int i,int left,int right)
{if(tree[i].left==left&&tree[i].right==right){ans=min(ans,tree[i].minn);return ;}int mid=(tree[i].left+tree[i].right)>>1;if(tree[i].val!=inf){pushdown(i);}if(right<=mid)query(i<<1,left,right);else if(left>mid)query(i<<1|1,left,right);else{query(i<<1,left,mid);query(i<<1|1,mid+1,right);}tree[i].minn=min(tree[i<<1].minn,tree[i<<1|1].minn);return ;
}
int main()
{while(~scanf("%d%d",&n,&m)&&(n+m)){for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){scanf("%d",&timed[i][j]);}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){scanf("%d",&f[i][j]);}}for(int i=1;i<=m;i++){dp[i]=timed[1][i];}for(int i=2;i<=n;i++){build(1,1,m);for(int j=1;j<=m;j++){int l=max(j-f[i-1][j],1);int r=min(j+f[i-1][j],m);update(1,l,r,dp[ j ]);}for(int j=1;j<=m;j++){int l=max(j-f[i][j],1);int r=min(j+f[i][j],m);ans=inf;query(1,l,r);dp[j]=ans+timed[i][j];}//  for(int i=1;i<=m;i++)//      printf("%d ",dp[i]);//  printf("\n");}int minnn=inf;for(int i=1;i<=m;i++){minnn=min(minnn,dp[i]);}printf("%d\n",minnn);}
}

HDU 3698-Let the light guide us(线段树+DP)愿圣光忽悠你相关推荐

  1. HDU3698-Let the light guide us (线段树优化的dp)

    Plain of despair was once an ancient battlefield where those brave spirits had rested in peace for t ...

  2. HDU 3016 Man Down (线段树+dp)

    HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  3. P1295 [TJOI2011]书架(线段树dp)

    P1295 [TJOI2011]书架(线段树dp) 我好菜 先考虑普通dp: d p i = m i n ( d p j + m a x ( h j + 1 , h j + 2 - , h i ) ) ...

  4. hdu 5511 Minimum Cut-Cut——分类讨论思想+线段树合并

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5511 题意:割一些边使得无向图变成不连通的,并且恰好割了两条给定生成树上的边.满足非树边两段一定在给定生成 ...

  5. HDU 4911 http://acm.hdu.edu.cn/showproblem.php?pid=4911(线段树求逆序对)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4911 解题报告: 给出一个长度为n的序列,然后给出一个k,要你求最多做k次相邻的数字交换后,逆序数最少 ...

  6. 【HDU】4942 Game on S♂play 线段树

    传送门:[HDU]4942 Game on S♂play 题目分析:今天下午被这道题整死了,因为我的写法导致有的数可能变成负的,但是我们有察觉到,debug了一下午还是在吃饭的时候突然想到这个问题的. ...

  7. 【HDU】5238 Calculator 【中国剩余定理+线段树】

    传送门:[HDU]5238 Calculator 题目分析: 模数可以拆成四个小素数:7,13,17,19. 这样我们可以分别对这几个素数跑答案,最后中国剩余定理搞一下就好.中间我们用线段树,保存每个 ...

  8. HDU 5172 GTY's gay friends (线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5172 题意: 给你一个n个数的数组,m次询问,询问在[L, R] 这个区间里面有没有 [1, R-L+ ...

  9. BestCoder Round #29 1003 (hdu 5172) GTY's gay friends [线段树 判不同 预处理 好题]

    传送门 GTY's gay friends Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Ot ...

最新文章

  1. CRF算法中辅助概念 团 极大团 最大团
  2. tensorflow 查看graph
  3. 2017-11-26 编程语言试验之Antlr4+Java实现圈2
  4. 堆栈跟踪 堆栈跟踪_寻找缺少的堆栈跟踪
  5. mysql执行sql流程_MySQL架构与SQL执行流程
  6. 利用PCF8591进行AD转换
  7. Jurassic.ScriptEngine 简易示例
  8. 上海大学c语言程序设计,上海大学2009-2010年度C语言程序设计秋季学期试卷.doc
  9. Redis 介绍2——常见基本类型
  10. OFFICE技术讲座:JDK绘制旋转字体的效果(水平)
  11. 人工智能大数据时代下的工程伦理问题探讨
  12. matlab s函数z变换,Matlab符号计算——s函数转z函数
  13. DM6437 720P调试问题记录
  14. android 7 uc flash,UC浏览器7.2版新增加FLASH游戏支持功能
  15. QtCreator中Kits选项变灰,有感叹号
  16. 最好云计算机,教你怎么挑选最合适自己的云电脑
  17. 11.构造方法:什么是构造方法???使用构造方法要注意哪七点???
  18. js优化上传大图片显示问题(压缩图片展示)
  19. 2022强大的修复版趣味心理测试小程序源码,趣味测试引流裂变神器,流量主激励广告实现管道收益
  20. 破解打开证书加密的PDF文档-数字证书(电子书私钥)下载和导入教程

热门文章

  1. 网上赚钱日结工资正规,看懂就去操作吧!
  2. 终于搞清楚了,关于核心线程会不会回收
  3. Activiti 数据库表结构 ACT_GE_PROPERTY
  4. Google Pixel 2 相机测试
  5. 基于NodeJs的爬虫
  6. C语言逻辑左移指令shl怎么用,汇编语言SHL(左移)指令:将操作数逻辑左移一位...
  7. Android 我的第一个Jetpack Compose应用
  8. python 分词字典的词性_自然语言处理基础技术之分词、向量化、词性标注
  9. VC++ MFC 遍历注册表,获取网卡名称。(设备管理器中的名称)
  10. mysql多张表join_SQL优化之多表join