APIO2015巴厘岛的雕塑——数位DP
题目:https://www.luogu.org/problemnew/show/P3646
对于A>1,将答案各位全置1,然后从高位到低位改成0判断是否可行;
用f[i][j]数组代表前i个数分成j组是否可行,转移是枚举最后一段的左端点k,然后看看后面整个一段的和能否满足要求,如果前后都满足就表示i,j状态也可行;
对于A=1,可以贪心地认为分组数量越少越好,所以可行性转化为最优性,省去一维,转移条件同上,取min即可;
先写了个WA一半的版本:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
int n,A,B,len;
ll f2[],ans,s[];
bool f[][];//可行性
bool dp1(ll x)
{
memset(f,,sizeof f);
f[][]=;
for(int i=;i<=n;i++)//前i个数分成j段 <- 前k个数分成j-1段
for(int j=;j<=i;j++)
for(int k=;k<i;k++)//
if(((s[i]-s[k])|x)==x)f[i][j]|=f[k][j-];
for(int i=A;i<=B;i++)
if(f[n][i])return ;
return ;
}
bool dp2(ll x)
{
// memset(f2,0x3f,sizeof f2);
f2[]=;
for(int i=;i<=n;i++)
{
ll ad=n+;
for(int j=;j<i;j++)//
if(((s[i]-s[j])|x)==x)ad=min(ad,f2[j]);
f2[i]=ad+;
}
return f2[n]<=B;
}
int main()
{
scanf("%d%d%d",&n,&A,&B);
for(int i=;i<=n;i++)
scanf("%lld",&s[i]);
for(int i=;i<=n;i++)
s[i]+=s[i-];
for(len = ;(1LL << len) <= s[n];len++);len--;//位数
if(A!=)
{
ans=(ll)(<<(len+));ans--;
for(int k=len;k>=;k--)//0!
{
ll tmp=ans-(ll)(<<k);
if(dp1(tmp))ans=tmp;
}
}
else
{
ans=(ll)(<<(len+));ans--;
for(int k=len;k>=;k--)
{
ll tmp=(ll)ans-(<<k);
if(dp2(tmp))ans=tmp;
}
}
printf("%lld",ans);
return ;
}
囧
后来又直接改成别的写法A的,但还是不太明白原来的写法为什么不行,有什么不同。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
int n,A,B,len;
ll f2[],ans,s[];
bool f[][];//可行性
ll dp1()
{
ans=;
for(int t=len;t>=;t--)
{
ans+=(1LL<<t)-;
memset(f,,sizeof f);
f[][]=;
for(int i=;i<=n;i++)//前i个数分成j段 <- 前k个数分成j-1段
for(int j=;j<=i;j++)
for(int k=;k<i;k++)//
if(((s[i]-s[k])|ans)==ans)f[i][j]|=f[k][j-];
bool fl=;
for(int i=A;i<=B;i++)fl|=f[n][i];
if(fl)ans-=(1LL<<t)-;
else ans++;
}
return ans;
}
ll dp2()
{
ans=;
for(int t=len;t>=;t--)
{
ans+=(1LL<<t)-;
f2[]=;
for(int i=;i<=n;i++)
{
ll ad=n+;
for(int j=;j<i;j++)//
if(((s[i]-s[j])|ans)==ans)ad=min(ad,f2[j]);
f2[i]=ad+;
}
if(f2[n]<=B)ans-=(1LL<<t)-;
else ans++;
}
return ans;
}
int main()
{
scanf("%d%d%d",&n,&A,&B);
for(int i=;i<=n;i++)
scanf("%lld",&s[i]);
for(int i=;i<=n;i++)
s[i]+=s[i-];
for(len = ;(1LL << len) <= s[n];len++);len--;//位数
if(A==)printf("%lld",dp2());
else printf("%lld",dp1());
return ;
}
APIO2015巴厘岛的雕塑——数位DP的更多相关文章
- [APIO2015]巴厘岛的雕塑    贪心+DP+特殊数据优化
		
写了好久.... 刚刚调了一个小时各种对拍,,,,最后发现是多写了一个等号,,,,内心拒绝 表示一开始看真的是各种懵逼啊 在偷听到某位大佬说的从高位开始贪心后发现可做 首先考虑小数据(因为可以乱搞) ...
 - bzoj 4069: [Apio2015]巴厘岛的雕塑【dp】
		
居然要对不同的数据写不同的dp= = 首先记得开long long,<<的时候要写成1ll<<bt 根据or的性质,总体思路是从大到小枚举答案的每一位,看是否能为0. 首先对于 ...
 - 【BZOJ4069】[Apio2015]巴厘岛的雕塑 按位贪心+DP
		
[BZOJ4069][Apio2015]巴厘岛的雕塑 Description 印尼巴厘岛的公路上有许多的雕塑,我们来关注它的一条主干道. 在这条主干道上一共有 N 座雕塑,为方便起见,我们把这些雕塑从 ...
 - bzoj 4069 [Apio2015]巴厘岛的雕塑 dp
		
[Apio2015]巴厘岛的雕塑 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 494 Solved: 238[Submit][Status][Dis ...
 - bzoj千题计划239:bzoj4069: [Apio2015]巴厘岛的雕塑
		
http://www.lydsy.com/JudgeOnline/problem.php?id=4069 a!=1: 从高位到低位一位一位的算 记录下哪些位必须为0 dp[i][j] 表示前i个数分为 ...
 - [APIO2015]巴厘岛的雕塑 --- 贪心 + 枚举
		
[APIO2015]巴厘岛的雕塑 题目描述 印尼巴厘岛的公路上有许多的雕塑,我们来关注它的一条主干道. 在这条主干道上一共有\(N\)座雕塑,为方便起见,我们把这些雕塑从 1 到\(N\)连续地进行 ...
 - 【BZOJ4069】【APIO2015】巴厘岛的雕塑 [贪心][DP]
		
巴厘岛的雕塑 Time Limit: 10 Sec Memory Limit: 64 MB[Submit][Status][Discuss] Description 印尼巴厘岛的公路上有许多的雕塑, ...
 - [BZOJ4069][Apio2015]巴厘岛的雕塑
		
题目大意 分成 \(x\) 堆,是的每堆的和的异或值最小 分析 这是一道非常简单的数位 \(DP\) 题 基于贪心思想,我们要尽量让最高位的 \(1\) 最小, 因此我们考虑从高位向低位进行枚举,看是 ...
 - 洛谷P3646 [APIO2015]巴厘岛的雕塑(数位dp)
		
传送门 话说莫非所有位运算都可以用贪心解决么……太珂怕啦…… 一直把或运算看成异或算我傻逼…… 考虑从高位到低位贪心,如果能使答案第$i$位为0那么肯定比不为$0$更优 然后考虑第$i$位是否能为$0 ...
 
随机推荐
- 如何使用电骡eMule上传资源
			
1 在电脑中创建一个文件夹专门为上传资源使用 在里面放入任意文件并右击显示ED2K链接 链接效果如下 2 登陆verycd网站,并点击上传资源 复制ED2K地址并选择分类
 - Ubuntu中一次更改用户名带来的连锁反应
			
我是一个ubuntu新手,接触ubuntu半年不到,装系统的时候输入了一个用户名,但是最近突然想更名了,这是悲剧的开始! google:ubuntu change username等相关的关键字,最终 ...
 - 反射 type 的基本用法,动态加载插件
			
这里介绍反射的简单实用 MyClass类 public class MyClass { public int Age { get; set; } public string Name { get; s ...
 - HDU 2648(搜索题,哈希表)
			
#include<iostream> #include<map> #include<string> #include<cstring> #include ...
 - Linux基础(3)- 正文处理命令及tar命令、vi编辑器、硬盘分区、格式化及文件系统的管理和软连接、硬连接
			
一.正文处理命令及tar命令 1) 将用户信息数据库文件和组信息数据库文件纵向合并为一个文件1.txt(覆盖) 2) 将用户信息数据库文件和用户密码数据库文件纵向合并为一个文件2.txt(追加) ...
 - pandas-事例练习
			
补充: DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False) 功能:根据各标签的值中是否存在缺失数据 ...
 - python-tornado操作
			
Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了能有效 ...
 - Jquery 插件 实例
			
先说明下应用场景,通过可配项的配置和默认项覆盖,获取指定的需求数据,填充到指定的位置(两个指定其实都是可配的) (function($) { $.fn.extend({ getOneNews: fun ...
 - 关于CSS和CSS3的布局小知识(干货)
			
最近在网站偶然看到的这个网站,进去看了下讲的CSS布局,感觉还不错,讲易懂且实用推荐给大家. http://zh.learnlayout.com/
 - 将txt文件数据存入excel表格
			
前言 最近使用Appium自动化在测试设备配网的情况,需要记录每次成功与否和耗时时间. 由于App不是很稳定,执行一段时间会奔溃,因此数据只能通过追加的形式写入到txt文件. 实现过程 存储在txt文 ...