当前位置: 首页 > 编程日记 > 正文

POJ-1185 炮兵阵地 动态规划+状态压缩

由于递推的时候依赖于三个连续层的关系.一开始想着直接三重for循环,但是这里有个问题就是上一层的0位置上包括着上上层是0和1两种可能,而后者又对当前行有约束,因此该方法不行.当然有一个办法就是增加状态数,让状态能够表示是从1还是从0转移过来的.(这题有个解法是采用多进制的状态压缩). 网上瞄了别人的一眼解题报告. 瞬间顿悟,竟然三层之间发生关系,那么就直接把连续的两层记录起来,虽然说空间上不及多进制优美. 但是却能够去描述这些个问题.

代码如下:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
using namespace std;/*
题意:给定一个矩阵,有点点能够放置部队,有的不行,部队能够进攻上下左右各2个格子,现在问要求所有部队火力不能够覆盖友方部队,问最多能够摆放多少部队.解法:其实这题单单就一行的状态来说,状态的约束条件更强,可以预见其合法状态也很少,何况给定列本身就不超过10, 因此一行中的合法状态一定很少. 该题难点在于如何将上下火力不覆盖友方部队很好的表示出来.一个可行的做法是对设置状态是dp[k][i][j]表示第k层的状态为i,第i-1层状态为j时最多放置多少部队. 所以又动态方程:dp[k][i][j] = sum(dp[k-1][j][k]) 其中k满足不和i发生冲突 
*/int N, M, sta[65], idx; // 当M=10的时候,合法的状态不超过65个
int G[105], dp[105][65][65]; // 该dp的第一维真正意义上表示一个状态,而不是状态的下表void display(int x) {for (int i = 0; i < M; ++i) {if (x & (1 << i)) {printf("1 ");} else printf("0 ");}puts("");getchar();
}void dfs(int pos, int statu, int dist) {if (pos == M) {sta[++idx] = statu;//    display(statu);return;}dfs(pos+1, statu<<1, dist+1);if (dist >= 2) {dfs(pos+1, statu<<1|1, 0);}
}bool legal(int x, int y) {return (x & y) == x; // 表示x状态的所有值都有对应的'P' 
}bool judge(int x, int y) {return !(x & y); // 如果没有对应的1
}int get(int x) {int ret = 0;for (int i = 0; i < M; ++i) {if (x & (1 << i)) {++ret;}}return ret; 
}int DP() {int ret = 0;memset(dp, 0, sizeof (dp));if (N == 1) { // 如果是只有一层的话,就特殊处理一下 for (int i = 1; i <= idx; ++i) {if (legal(sta[i], G[1])) {ret = max(ret, get(sta[i]));    }}    return ret;    }// 初始化第一,二层的状态for (int i = 1; i <= idx; ++i) { // 枚举第二层要更新的状态 for (int j = 1; j <= idx; ++j) { // 枚举第一层的状态 if (legal(sta[i], G[2]) && legal(sta[j], G[1]) && judge(sta[i], sta[j])) {dp[2][i][j] = get(sta[i]) + get(sta[j]);}}}for (int k = 3; k <= N; ++k) {for (int i = 1; i <= idx; ++i) {for (int j = 1; j <= idx; ++j) {if (!judge(sta[i], sta[j]) || !legal(sta[i], G[k]) || !legal(sta[j], G[k-1])) {continue;}for (int m = 1; m <= idx; ++m) {if (judge(sta[i], sta[m]) && judge(sta[j], sta[m])) {dp[k][i][j] = max(dp[k][i][j], dp[k-1][j][m]);}}dp[k][i][j] += get(sta[i]);}}}for (int i = 1; i <= idx; ++i) {for (int j = 1; j <= idx; ++j) {ret = max(ret, dp[N][i][j]);}}return ret;
}int main() {char str[15];while (scanf("%d %d", &N, &M) == 2) {idx = 0, dfs(0, 0, 2);//    printf("idx = %d\n", idx);memset(G, 0, sizeof (G));for (int i = 1; i <= N; ++i) {scanf("%s", str);for (int j = 0; j < M; ++j) {G[i] <<= 1, G[i] |= str[j] == 'P'; // 当等于P的时候能够放置部队 
            }}printf("%d\n", DP());}return 0;    
}

转载于:https://www.cnblogs.com/Lyush/archive/2013/01/15/2861889.html

相关文章:

php字符串转换表达式,php处理字符串格式的计算表达式

有时候我们对每一种产品都有一个提成公式&#xff0c;而这个计算提成的公式是以字符串格式存在表中的当我们用这个计算公式时&#xff0c;他并不像我们写的&#xff1a;$a23*5;这样简单的能计算出结果&#xff0c;而它是个字符串所以&#xff0c;我们就必须把字符串转化为我们能…

JS函数式编程【译】5.2 函子 (Functors)

函子&#xff08;Functors&#xff09; 态射是类型之间的映射&#xff1b;函子是范畴之间的映射。可以认为函子是这样一个函数&#xff0c;它从一个容器中取出值&#xff0c; 并将其加工&#xff0c;然后放到一个新的容器中。这个函数的第一个输入的参数是类型的态射&#xff0…

[转]Introduction of iSCSI Target in Windows Server 2012

Introduction of iSCSI Target in Windows Server 2012 源地址&#xff1a;http://blogs.technet.com/b/filecab/archive/2012/05/21/introduction-of-iscsi-target-in-windows-server-2012.aspx The iSCSI Target made its debut as a free download for Windows 2008 R2 in A…

全国移动联通基站数据升级包(2013年1月基站升级包).rar

“全国移动联通基站数据升级包(2013年1月基站升级包).rar” 已经上传到CNBLOGS 地址&#xff1a;http://files.cnblogs.com/topwang-com/%E5%85%A8%E5%9B%BD%E7%A7%BB%E5%8A%A8%E8%81%94%E9%80%9A%E5%9F%BA%E7%AB%99%E6%95%B0%E6%8D%AE%E5%8D%87%E7%BA%A7%E5%8C%85(2013%E5%B9%…

php自动计算增长率,如何写sql计算增长率?

问题已有数据表(假定表名为t)time sale1999 4844904672000 651413668.92001 13713710082002 18177416252003 25053320952004 37654384862005 48177203842006 6083322598需要产生如下的数据表time sale …

我先了解一下博客园创建随笔/文章/日记的过程与三者的区别(隐私等级,是否审核等)...

我先了解一下博客园创建随笔/文章/日记的过程与三者的区别(隐私等级,是否审核等)转载于:https://www.cnblogs.com/Totooria-Hyperion/p/5260289.html

构建Java并发模型框架

2002 年 2 月 22 日 Java的多线程特性为构建高性能的应用提供了极大的方便&#xff0c;但是也带来了不少的麻烦。线程间同步、数据一致性等烦琐的问题需要细心的考虑&#xff0c;一不小心就会出现一些微妙的&#xff0c;难以调试的错误。另外&#xff0c;应用逻辑和线程逻辑纠缠…

Unity Note 1

1.把开始时间设定到播放完成的时间点&#xff0c;作为倒放的起点 animation["clip"].timeanimation["clip"].clip.length; animation["clip"].speed-1; animation.Play("clip"); 2.寻找场景中物体var door GameObject.Find(…

基于matlab的硅晶体模型,基于Matlab的图像处理技术识别硅太阳电池的缺陷

第 44 卷 第 7 期  2010 年 7 月 上 海 交 通 大 学 学 报 JOURNAL OF SHANGHAI J IAOTON G UNIVERSITY Vol. 44 No. 7   Jul. 2010   收稿日期 :20090908 作者简介 :柳效辉(19852) ,男 ,江西九江人 ,硕士生 ,主要从事光伏检测与光伏系统方面的研究. 徐  林(联系人) ,男 ,副…

spark- PySparkSQL之PySpark解析Json集合数据

PySparkSQL之PySpark解析Json集合数据 数据样本 12341234123412342|asefr-3423|[{"name":"spark","score":"65"},{"name":"airlow","score":"70"},{"name":"flume",&quo…

cmd库的导入Java,在cmd命令窗口导入第三方jar包来运行java文件

在cmd命令窗口导入第三方jar包来运行java文件&#xff0c;以下测试都是基于window环境&#xff0c;Linux环境没有测试。1、编译使用命令javac -cp或者javac -classpath本机测试&#xff1a;如下图所示&#xff0c;java文件路径为D:\workspace\demo,StringUtilsTest.java依赖了第…

JQuery 动态创建表单,并自动提交

前言&#xff1a;写这个是为了实现使用cookie进行自动登录的功能&#xff0c; 下面的代码是一个元素一个元素进行创建和赋值的&#xff0c; (可以尝试下将所有的html代码(form、input&#xff09;全部拼好以后放到${ } 中&#xff0c;再进行提交。) submit的时候注意下写法&…

(转)利用ArcScene进行三维地形模拟

本文摘自&#xff1a;http://www.sunzx.net/archive/1109.html 在ArcGIS Desktop中&#xff0c;可用于三维场景展示的程序为ArcGlobe和ArcScene&#xff0c;由于两者的差别&#xff0c;在三维场景展示中适用的情况有所不同。ArcScene是一个适合于展示三维透视场景的平台&#x…

Android使用自定义View时:Error inflating class错误的原因。

当在布局文件里使用自定义的View的时候&#xff0c;出现Error inflating class错误的原因&#xff1a; 1、没有定义inflate需要的默认构造函数&#xff1b; eg:自定义View为TestView,需要定义TestView(Context context),TestView(Context context,AttributeSet set); 2、这是个…

oracle的表几种连接比较,几种表连接方式的使用场景

1)nested loopnested loop&#xff0c;指的是两个表连接时, 通过两层嵌套循环来进行依次的匹配, 最后得到返回结果集的表连接方法.select t1.owner,t1.object_name,t2.OBJECT_IDfrom test_tab1 t1,test_tab2 t2where t1.OBJECT_ID t2.OBJECT_IDand ROWNUM select *from test_t…

Ajax 完整教程 (转)

Ajax 完整教程第 1 页 Ajax 简介Ajax 由 HTML、JavaScript™ 技术、DHTML 和 DOM 组成&#xff0c;这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应用程序。本文的作者是一位 Ajax 专家&#xff0c;他演示了这些技术如何协同工作 —— 从总体概述到细节的讨论 ——…

.Net中如何操作IIS(源代码)

http://www.daima.com.cn/Info/3/Info20453/转载于:https://www.cnblogs.com/luoyuan/archive/2005/09/17/238986.html

Enterprise Library Configuration DAAB的使用

1.要试用DAAB,首先要引用两个类库 第一个是Enterprise Library Shared Library 这个类库是所有Enterprist Library都必须引用的类库,它提供所需的结构类型. 第二个是Enterprist Library Data Access Application Block 这个就是daab的核心类库. 2试用DAAB的第一个步骤就是配置a…

安装oracle后在cmd,在WINDOWS上安装ORACLE RAC的注意事项

在WINDOWS上安装ORACLE RAC的注意事项1、检查防火墙和杀毒软件如果不关掉防火墙&#xff0c;在安装CRS时&#xff0c;在"Oracle Clusterware Configuration Assistant"界面会提示(1)OUI-25031错误(2)dddb1 service OracleCSService in improper PENDING state, err(9…

Tessellation (曲面细分) Displacement Mapping (贴图置换)

DirectX 11 Tessellation (曲面细分)—什么是 Tessellation (曲面细分) ?它为什么可以起到如此关键的数据?随着近期人们对 DirectX 11 的议论纷纷&#xff0c;你可能已经听说了有关 DirectX 11 最大新特性 Tessellation (曲面细分) 的大量介绍。作为一个概念。 Tessellation …

java 第12课

/*Java是面向对象的程序设计语言.面向对象的思想是将客观事物都作为实体,而对象通过实体抽象得到.所谓实体抽象,就是对实体的某些特征进行概括,使其数字化、符号化;比如:李四同学,就是一个实体,我们关心他的这些特征:姓名、性别、年龄、身高、体重等特征,就会有李四、男、21、1…

鸽巢原理(The Pigeonhole Principle)(抽屉原理)

简单形式&#xff1a;若n1个物体放进n个盒子&#xff0c;那么至少有一个盒子包含两个或更多的物体。 应用&#xff1a;给定m个整数A1,A2,...,Am,存在整数k和l&#xff0c; 0 < k < l < m,使得Ak1 Ak2 &#xff0b; ... Al能够被m整除。即在A1&#xff0c;A2&…

oracle10g删除asm组,Oracle 10G RAC 删除已有节点

如果现在在RAC集群中有三个节点c1、c2、c3&#xff1a;如果想要卸载c3节点。1、在c1或者c2上删除c3实例运行dbca然后选择Oracle Real Application Clusters database选择Instance Management选择Delete an instance选择实例&#xff0c;填写用户名密码&#xff0c;Next选择c3: …

嵌入式linux学习笔记1—内存管理MMU之虚拟地址到物理地址的转化

一.内存管理基本知识 1.S3C2440最多会用到两级页表&#xff1a;以段的方式进行转换时只用到一级页表&#xff0c;以页的方式进行转换时用到两级页表。页的大小有三种&#xff1a;大页&#xff08;64KB&#xff09;&#xff0c;小页&#xff08;4KB&#xff09;&#xff0c;极小…

C# 最快的逐一打印斐波那契结果数列的算法

用这种方法就无需将数列中的每一个元素都计算一遍了&#xff01; 说多无谓&#xff0c;直接上代码吧&#xff01; private void button5_Click(object sender, EventArgs e) { FiBoNaQi f new FiBoNaQi(); f.numberToCount (Int16)numericUpDown1.Value; f.DoFiB…

WSS 代码执行的权限提升

WSS 代码执行的权限提升 概述: WSS 默认使用身份模拟执行代码&#xff0c;也就是说用当前登录的用户身份执行Web Part或者自定义应用程序的代码访问。在大多数情况下&#xff0c;这种机制能够准确并严格地控制了标准权限的用户他对特定网站资源和敏感数据的访问&#xff0c;这也…

Oracle数据库联邦,使用联邦数据库将oracle表迁移到DB2(9.7)中的脚本说明

由于兄弟项目组要测试&#xff0c;需要将oracle中的表迁移到db2中&#xff0c;操作步骤如下&#xff1a;#1 在windows数据库中建联邦数据库服务器\用户映射connect to sampleCREATE WRAPPER DRDA LIBRARY db2drda.dll;--创建DB2包装器CREATE WRAPPER NET8 LIBRARY db2net8.dll;…

HDU 5047 Sawtooth 高精度

题意&#xff1a; 给出一个\(n(0 \leq n \leq 10^{12})\)&#xff0c;问\(n\)个\(M\)形的折线最多可以把平面分成几部分。 分析&#xff1a; 很容易猜出来这种公式一定的关于\(n\)的一个二次多项式。 不妨设\(f(n)an^2bnc\)。 结合样例我们可以列出\(3\)个方程&#xff1a;\(f(…

poj1129Channel Allocation

http://poj.org/problem?id1129 四色定理 最多有四色 从1到四搜 View Code 1 #include <iostream>2 #include<cstdio>3 #include<cstring>4 #include<stdlib.h>5 using namespace std;6 int n,w[100][100],co[100],mi,flag;7 void dfs(int x,int v)…

WCF 第二章 契约

在原子和金钱世界中&#xff0c;契约是两个或多个组织以一个已知的价格提供商品和服务的合同。在比特和服务的世界中&#xff0c;契约有类似的功能:它是两个或多个组织之间确定消息交换和消息条款及条件的合同。 契约是由服务终结点发送或接收的消息的描述。每一个终结点都由AB…