博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hdu-1565 电网接入(1) (国家压缩dp获得冠军
阅读量:6479 次
发布时间:2019-06-23

本文共 1110 字,大约阅读时间需要 3 分钟。

正方形格通路(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
 
3 75 15 21 75 15 28 34 70 5
 

Sample Output
 
188
 
入门压缩dp,与 
 

  类似。

用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]中的最大值。

代码:

#include
#include
#include
using namespace std;const int hpn=18000;int state[hpn],stn[25][hpn],dp[25][hpn];//dp[i][j]:前i行,第i行选第j种状态时的最优解int mst,map[25][25];//第i行选第j种状态时的值inline int bet(int x,int y){ if(x>y) return x; return y;}void find_all_state(int n){ memset(state,0,sizeof(state)); mst=0;//最多有多少种状态 int lin=(1<
>n) { if(n==0) { cout<<0<


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

本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4874332.html,如需转载请自行联系原作者

你可能感兴趣的文章
创建一个多级文件目录
查看>>
Picasa生成图片幻灯片页面图文教程
查看>>
svn status 显示 ~xx
查看>>
常用HiveQL总结
查看>>
[转]使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(三)-- Logger
查看>>
POJ 3311 Hie with the Pie(状压DP + Floyd)
查看>>
Security updates and resources
查看>>
DNS为什么通常都会设置为14.114.114.114
查看>>
Sqoop架构(四)
查看>>
golang copy函数
查看>>
《你有多少问题要请示》精华集粹
查看>>
打印图片
查看>>
SHOW CREATE DATABASE Syntax
查看>>
rsync常见问题及解决办法
查看>>
MySQL日期 专题
查看>>
C#中禁止程序多开
查看>>
分布式缓存Redis使用以及原理
查看>>
Activity竟然有两个onCreate方法,可别用错了
查看>>
Linux经常使用命令(十六) - whereis
查看>>
Linux五种IO模型
查看>>