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 ...
随机推荐
- hibernater-validator jar包冲突的问题
在引用hibernater-validator jar包时一直抛出异常,在引用带有该包的项目,或者同时在一个项目中使用该包和validator包都会抛出以下异常 最后发现是在Eclipse环境下,不能 ...
- 简学lingo(四)——实例篇
本片将会接着上篇实例来写,如要參照能够看下上篇的http://blog.csdn.net/yzu_120702117/article/details/38453791 如有句法上的问题能够參照我之前总 ...
- Eoeclient源代码分析---SlidingMenu的使用
Eoeclient源代码分析及代码凝视 使用滑动菜单SlidingMenu,单击滑动菜单的不同选项,能够通过ViewPager和PagerIndicator显示相应的数据内容. 0 BaseSlid ...
- ios文件系统文件目录操作
对于一个运行在iPhone得app,它只能访问自己根目录下得一些文件(所谓sandbox). 一个app发布到iPhone上后,目录结构如下: 1.其中获取 app root 可以用 NSHomeDi ...
- ffplay 播放m3u8 hls Failed to open segment of playlist 0
用ffplay 播放m3u8文件 出现 Failed to open segment of playlist 0,Error when loading first segment 'test0.ts' ...
- ElasticSearchserver操作命令
在win7环境,进入elasticsearch安装文件夹的bin文件夹: 1. elasticsearch.bat 就能够启动elasticsearch了.执行这个插件的优点是:elasticsear ...
- [LeetCode]Insert Interval 考虑多种情况
写太复杂了. 思想:确定带插入区间的每一个边界位于给定区间中的哪个位置,共同拥有5种情况 -1 |(0)_1_(2)| (3) 当中.0,1,2这三种情况是一样的. 确定每一个带插入区间的两个边界分 ...
- linux实现php定时执行cron任务详解(转)
对于PHP本身并没有一套解决方案来执行定时任务,不过是借助sleep函数完成的.这种方就是要提前做一些配置,如实现过程: 复制代码 代码如下: ignore_user_abort();//关掉浏览器, ...
- 如何求文件File的字节数
[java]代码库 import java.io.*; /** * 获取文件的字节数 */ class FileInputStreamS { public static voi ...
- MySQL Infobright 数据仓库快速安装笔记[转]
[文章作者:张宴 本文版本:v1.1 最后修改:2010.05.18 转载请注明原文链接:http://blog.zyan.cc/infobright/] Infobright是一个与MySQL集成的 ...