J - 男神的约会

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
Submit Status

有一天男神约了学姐姐去看电影,电影院有一个活动,给你一个10*10的矩阵,每一个格子上都有一个0-9的整数,表示一共十种优惠券中的一种。

观众从左上角的格子开始走,走到右下角。每走到一个有着a号优惠券的格子,都必须要玩一个a分钟的游戏来领取这张优惠券。

每次只能向右或向下走。当走到右下角的时候,如果集齐10种优惠券就可以半价看电影呢。

为了能在学姐姐面前展示自己的才智,男神准备用最少的时间领取全部的优惠券(他要省出最多的时间陪学姐姐)。聪明的你能告诉男神,他最少要花费的时间是多少?

Input

输入包含10行,每行10个数字,以空格隔开,表示格子上的优惠券的种类。数据保证存在合法路径。

Output

输出男神走到右下角的最小时间花费。

Sample input and output

Sample Input Sample Output
  1. 0 1 2 3 4 5 6 7 8 9
  2. 1 1 1 1 1 1 1 1 1 0
  3. 2 1 1 1 1 1 1 1 1 0
  4. 3 1 1 1 1 1 1 1 1 0
  5. 4 1 1 1 1 1 1 1 1 0
  6. 5 1 1 1 1 1 1 1 1 0
  7. 6 1 1 1 1 1 1 1 1 0
  8. 7 1 1 1 1 1 1 1 1 0
  9. 8 1 1 1 1 1 1 1 1 0
  10. 9 1 1 1 1 1 1 1 1 5
  1. 50

影响当前决策的有所在的位置和收集过的优惠劵因此定义状态dp[i][j][sta]为到i,j位置sta状态的最小花费,问题来了,sta怎么表示,比较好的办法是用一个二进制,一位对应一种优惠劵,0表示没有收集过,1表示收集过。状态转移方程dp[i][j][st|1<<mp[i][j]]=min(dp[i-1][j][st],dp[i][j-1][st]|(i-1,j)+mp[i][j],(i,j-1)合法,st相等),注意递推顺序应该是由左上角往右下斜着推,用一个队列来实现。

memset是按字节赋值的,so。int只有赋值-1和0才会对应-1和0

  1. #include<cstdio>
  2. #include<memory.h>
  3. #include<queue>
  4. #include<algorithm>
  5. using namespace std;
  6.  
  7. const int MAXSTA=0x3ff;
  8. const int MAXij=;
  9. //const int SIGN=16843009;//0x01010101
  10. int dp[MAXij][MAXij][MAXSTA];
  11.  
  12. int mp[MAXij][MAXij];
  13. bool vis[MAXij][MAXij][MAXSTA];
  14. int solve()
  15. {
  16. queue<int>qi;
  17. queue<int>qj;
  18. queue<int>qst;
  19. int ci=,cj=,cst=<<mp[][];
  20. memset(dp,,sizeof(dp));
  21. //memset(vis,0,sizeof(vis));
  22. dp[ci][cj][cst]=mp[][];
  23.  
  24. int ni,nj,nst;
  25. do
  26. {
  27. if(ci<){
  28. ni=ci+,nj=cj;
  29. nst=cst|(<<mp[ni][nj]);
  30. dp[ni][nj][nst]=min(dp[ni][nj][nst],dp[ci][cj][cst]+mp[ni][nj]);
  31. if(!vis[ni][nj][nst])
  32. {
  33. qi.push(ni);
  34. qj.push(nj);
  35. qst.push(nst);
  36. vis[ni][nj][nst]=true;
  37. }
  38. }
  39. if(cj<){
  40. ni=ci,nj=cj+;
  41. nst=cst|(<<mp[ni][nj]);
  42. dp[ni][nj][nst]=min(dp[ni][nj][nst],dp[ci][cj][cst]+mp[ni][nj]);
  43. if(!vis[ni][nj][nst])
  44. {
  45. qi.push(ni);
  46. qj.push(nj);
  47. qst.push(nst);
  48. vis[ni][nj][nst]=true;
  49. }
  50. }
  51. ci=qi.front();
  52. cj=qj.front();
  53. cst=qst.front();
  54. qi.pop();
  55. qj.pop();
  56. qst.pop();
  57. }while(qi.size());
  58. }
  59.  
  60. int main()
  61. {
  62. //freopen("Jinput.txt","r",stdin);
  63. int i,j;
  64. for(i=;i<;i++)
  65. for(j=;j<;j++)
  66. scanf("%d",&mp[i][j]);
  67.  
  68. solve();
  69. printf("%d",dp[][][MAXSTA]);
  70. }

[dp][uestc oj]J - 男神的约会的更多相关文章

  1. UESTC 2015dp专题 j 男神的约会 bfs

    男神的约会 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/65 Descri ...

  2. [动态规划] uestc oj A - 男神的礼物

    A - 男神的礼物 Time Limit: 3000/3000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Lweb学长 ...

  3. UESTC_男神的约会 2015 UESTC Training for Dynamic Programming<Problem J>

    J - 男神的约会 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit ...

  4. 男神的约会(状压dp)

    有一天男神约了学姐姐去看电影,电影院有一个活动,给你一个10*10的矩阵,每一个格子上都有一个0-9的整数,表示一共十种优惠券中的一种. 观众从左上角的格子开始走,走到右下角.每走到一个有着a号优惠券 ...

  5. [dp]uestc oj 邱老师看电影

      定义状态dp[w][b]表示有w只白老鼠,b只黑老鼠时妹子赢的概率,分两种情况妹子抓到白老鼠概率为w/(w+b)和否则只有妹子抓黑老鼠和邱老师抓黑老鼠妹子才可能赢,再分两种情况:酱神抓白老鼠,状态 ...

  6. cdoj 1134 男神的约会 状压dp

    题目链接 给一个10*10的方格, 每个格子里面有0-9,走到一个格子, 就要在这个格子待一段时间, 时间长度为这个格子的数字. 从左上角走到右下角, 要求0-9必须每种格子都要走到, 输出最短时间. ...

  7. [dp][uestc oj][最长上升子序列] LIS N - 导弹拦截

    N - 导弹拦截 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  ...

  8. [dp uestc oj] G - 邱老师玩游戏

    G - 邱老师玩游戏 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  9. [dp]uestc oj E - 菲波拉契数制

    E - 菲波拉契数制 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

随机推荐

  1. Spring入门第二十课

    返回通知,异常通知,环绕通知 看代码: package logan.study.aop.impl; public interface ArithmeticCalculator { int add(in ...

  2. eos管理页面

    调用此方法删除需要在po_module_processdef添加数据如下 默认情况下申请页面是有权限的 但是在此表加过之后 管理页面要打开拟稿页面还必须在   系统管理页面(xtgl.jsp )  分 ...

  3. redis win连接以及配置连接密码

    redis连接格式为 redis-cli -h host -p port -a password 但由于刚安装的redis是没有密码的 因此可以进行直接连接, cd转到redis目录里 redis-c ...

  4. java基础第十一篇之Date、Math、自动装箱和拆箱

    Date类 表示一个瞬间,就是一个时刻 * * 构造方法: * public Date();//创建一个表示当前系统时间的Date对象 * public Date(long time);//毫秒值,距 ...

  5. STP-12-MST工作原理

    MST将网络划分为一或多个区域.一个MST区域是一组以相同方式共同使用MST的交换机——除了其他特性外,它们运行相同数量的MST实例,并在这些实例上映射相同的VLAN集合. 例如,在下图中,工程师定义 ...

  6. js 对象深拷贝

    /* *p需要拷贝的对象 * */ var deepCopy=function(p, c) { var c = c || {}; for (var i in p) { if (typeof p[i] ...

  7. VS 小插件 之 编辑器背景图片

    一.引言 不知道标题的名字我描述的是否正确哈,其实就是用VS写代码的时候,背景一般都是纯白 或者 纯黑(看主题而定),那么我前段时间发现 只需要一个VS插件,居然可以给VS设置背景图片,甚至还可以循环 ...

  8. JavaScript引擎基本原理: 优化prototypes

    原文链接: JavaScript engine fundamentals: optimizing prototypes 这篇文章介绍了一些JavaScript引擎常用的优化关键点, 并不只是Bened ...

  9. 一行命令将ubuntu升级到最新版本

    zzupdate 是一个开源的命令行程序,通过将几个更新命令组合到一个命令中,使得将 Ubuntu 桌面和服务器版本升级到更新版本的任务变得容易一些. 将 Ubuntu 系统升级到更新的版本并不是一项 ...

  10. 健康检查NET Core之跨平台的实时性能监控

    ASP.NET Core之跨平台的实时性能监控(2.健康检查)   前言 上篇我们讲了如何使用App Metrics 做一个简单的APM监控,最后提到过健康检查这个东西. 这篇主要就是讲解健康检查的内 ...