正方形格通路(1)

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 4702    Accepted Submission(s): 1782

Problem Description
给你一个n*n的格子的棋盘,每一个格子里面有一个非负数。

从中取出若干个数。使得随意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻。而且取出的数的和最大。

 
Input
包含多个測试实例,每一个測试实例包含一个整数n 和n*n个非负数(n<=20)
 
Output
对于每一个測试实例。输出可能取得的最大的和
 
Sample Input
  1. 3
  2. 75 15 21
  3. 75 15 28
  4. 34 70 5
 
Sample Output
  1. 188
 

入门压缩dp,与

Poj - 3254 Corn Fields

类似。

用dp[i][j]表示前i行。第i行选第j种状态时的最优解,

首先找出全部本行不冲突的状态(即这一行中没有相邻的情况),存入state数组

计算出第i行取第j种状态时可得到的数值stn[i][j]

那么dp[i][j]=max{dp[i][j],dp[i-1][k]+stn[i][j]}
(k表示第i-1行取第k种状态

终于答案即为dp[n][j]中的最大值。

代码:

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. using namespace std;
  5. const int hpn=18000;
  6. int state[hpn],stn[25][hpn],dp[25][hpn];
  7. //dp[i][j]:前i行,第i行选第j种状态时的最优解
  8. int mst,map[25][25];//第i行选第j种状态时的值
  9.  
  10. inline int bet(int x,int y)
  11. {
  12. if(x>y) return x;
  13. return y;
  14. }
  15.  
  16. void find_all_state(int n)
  17. {
  18. memset(state,0,sizeof(state));
  19. mst=0;//最多有多少种状态
  20. int lin=(1<<n),index=1;
  21. for(int i=0;i<lin;++i)
  22. {
  23. if((i&(i<<1))==0)
  24. {
  25. state[index]=i;
  26. ++mst;
  27. ++index;
  28. }
  29. }
  30. }
  31.  
  32. int main()
  33. {
  34. int n;
  35. while(cin>>n)
  36. {
  37. if(n==0)
  38. {
  39. cout<<0<<endl;
  40. continue;
  41. }
  42. find_all_state(n);
  43.  
  44. for(int i=1;i<=n;++i)
  45. {
  46. for(int j=1;j<=n;++j)
  47. {
  48. scanf("%d",&map[i][j]);
  49. }
  50. }
  51.  
  52. memset(stn,0,sizeof(stn));
  53. for(int i=1;i<=n;++i)
  54. {
  55. for(int j=1;j<=mst;++j)
  56. {
  57. int b=n;
  58. for(int t=1;t<(1<<n);t=(t<<1))
  59. {
  60. if((t&state[j])!=0)
  61. {
  62. stn[i][j]+=map[i][b];
  63. }
  64. --b;
  65. }
  66. }
  67. }//统计第i行选第j种状态时可得到的值
  68.  
  69. memset(dp,0,sizeof(dp));
  70. for(int i=1;i<=mst;++i)//第一行取第i种状态时
  71. {
  72. dp[1][i]=stn[1][i];
  73. }
  74. for(int i=2;i<=n;++i)//对于第i行
  75. {
  76. for(int j=1;j<=mst;++j)//取第j种状态
  77. {
  78. for(int k=1;k<=mst;++k)//第i-1行取第k种状态
  79. {
  80. if((state[j]&state[k])!=0) continue;
  81. dp[i][j]=bet(dp[i][j],dp[i-1][k]+stn[i][j]);
  82. }
  83. }
  84. }
  85.  
  86. int ans=0;
  87. for(int i=1;i<=mst;++i)
  88. {
  89. ans=bet(ans,dp[n][i]);
  90. }
  91.  
  92. cout<<ans<<endl;
  93. }
  94. return 0;
  95. }

版权声明:本文博主原创文章,博客,未经同意不得转载。

Hdu-1565 电网接入(1) (国家压缩dp获得冠军的更多相关文章

  1. hdu 5025 Saving Tang Monk 状态压缩dp+广搜

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092939.html 题目链接:hdu 5025 Saving Tang Monk 状态压缩 ...

  2. HDU 3681 Prison Break(状态压缩dp + BFS)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3681 前些天花时间看到的题目,但写出不来,弱弱的放弃了.没想到现在学弟居然写出这种代码来,大吃一惊附加 ...

  3. HDU 6125 Free from square 状态压缩DP + 分组背包

    Free from square Problem Description There is a set including all positive integers that are not mor ...

  4. hdu - 5045 - Contest(国家压缩dp)

    意甲冠军:N个人M通过主打歌有自己的期望,每个问题发送人玩.它不能超过随机播放的次数1,追求最大业绩预期 (1 ≤ N ≤ 10,1 ≤ M ≤ 1000). 主题链接:pid=5045" ...

  5. HDU 1565 方格取数(1) 轮廓线dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1565 方格取数(1) Time Limit: 10000/5000 MS (Java/Others) ...

  6. HDU 1074 Doing Homework【状态压缩DP】

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1074 题意: 给定作业截止时间和完成作业所需时间,比截止时间晚一天扣一分,问如何安排作业的顺序使得最 ...

  7. poj 3254 Corn Fields 国家压缩dp

    意甲冠军: 要在m行n陆行,有一些格您可以种树,别人做不到的.不相邻的树,我问了一些不同的共同拥有的法律. 分析: 从后往前种,子问题向父问题扩展,当种到某一格时仅仅有他和他后面的n-1个格子的情况对 ...

  8. HDU 1074 Doing Homework (状态压缩DP)

    Doing Homework Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  9. HDU 1565 方格取数(1) ——插头DP

    [题目分析] 其实直接状压就可以了. 但是有点闲,又写了一个可读性极差,智商低下,很(gou)好(pi)的代码 [代码] #include <cstdio> #include <cs ...

随机推荐

  1. POJ 3415 Max Sum of Max-K-sub-sequence (线段树+dp思想)

    Max Sum of Max-K-sub-sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  2. Threejs 的场景查看 - 几个交互事件库助你方便查看场景

    Threejs 的场景查看 - 几个交互事件库助你方便查看场景 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致&q ...

  3. 安卓开发28:自定义View类

    自定义View类 通过自定义View类,可以自定义复杂的,按照自己需求的控件. 一个简单的例子 mainActivity.java 这个里面就是最普通的代码,但是给自定义的控件加上了一个onclick ...

  4. 《深入理解OSGi:Equinox原理、应用与最佳实践》笔记_2_建立开发环境

    本文对应书本5.1.3的内容 书本中通过CVS下载的源码 但是笔者实践的时候发现无法下载...地址已经失效了(也许是笔者的失误输错地址所致) 可以用git下载 地址是: http://git.ecli ...

  5. linux下查看日志基本命令

    1.cat命令: 功能:1)显示整个文件. 演示样例: $ cat fileName 2)把文件串连接后传到基本输出,如将几个文件合并为一个文件或输出到屏幕. 演示样例: $ cat file1 fi ...

  6. SQL SERVER中的流程控制语句

    流程控制语句 是指用来控制程序运行和流程分至点额命令.一般指的是逻辑计算部分的控制. 1.Begin End语句 封装了多个T-SQL语句组合,将他们组成一个单元来处理. 一般在条件查询或者循环等控制 ...

  7. 在阿里云的CentOS环境中安装django

    购买了一台阿里云主机.操作系统为CentOS 6.5.准备在上面跑Django做Web开发.因为CentOS自带的python版本号较低,安装Django先要安装新版本号python.还是费了点周折. ...

  8. Java 兑换ObjectC代码

    现在非常多app发展,server我们使用Java发展,实时数据交换,与Android非常easy实现.是否xml依然是json,它可以很容易地转换成一个对象.这可以是硬IOS该程序猿.它们应根据数据 ...

  9. java文件创建、删除、读取、写入操作大全

    一.获得控制台用户输入的信息 public String getInputMessage() throws IOException...{ System.out.println("请输入您的 ...

  10. 【Android UI】案例03滑动切换效果的实现(ViewPager)

    本例使用ViewPager实现滑动切换的效果.本例涉及的ViewPager.为android.support.v4.view.ViewPager.所以须要在android项目中导入android-su ...