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一半的版本:
![](/assets/blank.gif)
![](/assets/blank.gif)
#include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long ll; int n,A,B,len; ll f2[2005],ans,s[2005]; bool f[105][105];//可行性 bool dp1(ll x) {memset(f,0,sizeof f);f[0][0]=1;for(int i=1;i<=n;i++)//前i个数分成j段 <- 前k个数分成j-1段 for(int j=1;j<=i;j++)for(int k=0;k<i;k++)//0if(((s[i]-s[k])|x)==x)f[i][j]|=f[k][j-1];for(int i=A;i<=B;i++)if(f[n][i])return 1;return 0; } bool dp2(ll x) { // memset(f2,0x3f,sizeof f2);f2[0]=0;for(int i=1;i<=n;i++){ll ad=n+1;for(int j=0;j<i;j++)//0if(((s[i]-s[j])|x)==x)ad=min(ad,f2[j]);f2[i]=ad+1;}return f2[n]<=B; } int main() {scanf("%d%d%d",&n,&A,&B);for(int i=1;i<=n;i++)scanf("%lld",&s[i]);for(int i=1;i<=n;i++)s[i]+=s[i-1];for(len = 0;(1LL << len) <= s[n];len++);len--;//位数 if(A!=1){ans=(ll)(1<<(len+1));ans--;for(int k=len;k>=0;k--)//0! {ll tmp=ans-(ll)(1<<k);if(dp1(tmp))ans=tmp;}}else{ans=(ll)(1<<(len+1));ans--;for(int k=len;k>=0;k--){ll tmp=(ll)ans-(1<<k);if(dp2(tmp))ans=tmp;}}printf("%lld",ans);return 0; }
囧
后来又直接改成别的写法A的,但还是不太明白原来的写法为什么不行,有什么不同。
代码如下:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long ll; int n,A,B,len; ll f2[2005],ans,s[2005]; bool f[105][105];//可行性 ll dp1() {ans=0;for(int t=len;t>=0;t--){ans+=(1LL<<t)-1;memset(f,0,sizeof f);f[0][0]=1;for(int i=1;i<=n;i++)//前i个数分成j段 <- 前k个数分成j-1段 for(int j=1;j<=i;j++)for(int k=0;k<i;k++)//0if(((s[i]-s[k])|ans)==ans)f[i][j]|=f[k][j-1];bool fl=0;for(int i=A;i<=B;i++)fl|=f[n][i];if(fl)ans-=(1LL<<t)-1;else ans++;}return ans; } ll dp2() {ans=0;for(int t=len;t>=0;t--){ans+=(1LL<<t)-1;f2[0]=0;for(int i=1;i<=n;i++){ll ad=n+1;for(int j=0;j<i;j++)//0if(((s[i]-s[j])|ans)==ans)ad=min(ad,f2[j]);f2[i]=ad+1;}if(f2[n]<=B)ans-=(1LL<<t)-1;else ans++;}return ans; } int main() {scanf("%d%d%d",&n,&A,&B);for(int i=1;i<=n;i++)scanf("%lld",&s[i]);for(int i=1;i<=n;i++)s[i]+=s[i-1];for(len = 0;(1LL << len) <= s[n];len++);len--;//位数 if(A==1)printf("%lld",dp2());else printf("%lld",dp1());return 0; }
转载于:https://www.cnblogs.com/Zinn/p/8971746.html
APIO2015巴厘岛的雕塑——数位DP相关推荐
- 【BZOJ4069】[Apio2015]巴厘岛的雕塑 按位贪心+DP
[BZOJ4069][Apio2015]巴厘岛的雕塑 Description 印尼巴厘岛的公路上有许多的雕塑,我们来关注它的一条主干道. 在这条主干道上一共有 N 座雕塑,为方便起见,我们把这些雕塑从 ...
- Bzoj4069:[Apio2015]巴厘岛的雕塑:dp+贪心
题目链接:[Apio2015]巴厘岛的雕塑 一开始先写了个既错误又高复杂度的dp,令dp[i][j]=min(dp[i][k],dp[j][k-1]|(s[i]-s[j])),其中s[]代表前缀和 首 ...
- 【BZOJ4069】【APIO2015】巴厘岛的雕塑 [贪心][DP]
巴厘岛的雕塑 Time Limit: 10 Sec Memory Limit: 64 MB [Submit][Status][Discuss] Description 印尼巴厘岛的公路上有许多的雕塑 ...
- [APIO2015]巴厘岛的雕塑(数位dp)
[题解] 引用ZYF神犇一句话:"显然位运算的极值问题都应该从高位向低位考虑.优先让这一位为0,如果行的话这一位就是0,否则就设为1." 设答案为ans,从高位到低位枚举 是否有使 ...
- 4069: [Apio2015]巴厘岛的雕塑 DP+按位贪心
去年的我对位运算一无所知..所以在考场上直接没敢看题..之后据说搜索有分,错的DP有分.我的内心是崩溃的..然而就算看了题还是什么都不会写. 考虑按位贪心,从高位到低位枚举,用 fi,j f_{i,j ...
- [APIO2015]巴厘岛的雕塑[按位贪心+dp]
题意 给你长度为 \(n\) 的序列,要求分成 \(k\) 段连续非空的区间,求所有区间和的 \(or\) 最小值. 分析 定义 \(f_{i,j}\) 表示前 \(i\) 个点分成 \(j\) 段的 ...
- P3646 [APIO2015]巴厘岛的雕塑
非常好的二进制dp题 参考了这位大佬的思路:https://www.cnblogs.com/zbtrs/p/8495170.html #include<iostream> #include ...
- 【bzoj 1833】【codevs 1359】 [ZJOI2010]count 数字计数(数位dp)
1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec Memory Limit: 64 MB Submit: 2774 Solved: 1230 [Submit ...
- 不要62 ---数位DP
题意:求m到n中不含62和4的数的个数. 题目链接 思路:数位dp模板求满足的数字或不满足的数字,刚学,就求不满足的数. #include<stdio.h> #include<str ...
最新文章
- 物联网技术在智能医疗领域的应用与发展
- Oracle 12c coming soon?
- 若要加载模块二进制_春哥说 | 浅谈NodeJs的模块机制-2
- WPF 3D 学习 - 3D材质初步
- s8050三极管经典电路_浅谈电路的PSRR(电源纹波抑制比)
- C++中WSAAsyncSelect模型的用法例程
- cad怎么将图层后置_CAD中如何将某1个图层置于其他图层之上.doc
- Mybatis源码之与Spring集成包
- php授权验证系统 c,OAuth 2.0 授权码认证
- [转]使用jQuery获取radio/checkbox组的值的代码收集
- diskgenius创建efi分区_DISKGEN 专业版修改硬盘为GPT分区 ESP分区图文教程
- 21天jmeter打卡 day1
- ortoiseGit--小乌龟git项目
- Java-面向对象编程-三大特性之多态
- 中投、汇金、四大国有资产管理公司、华融、长城、东方、信达
- 虚拟光驱传文件到服务器,虚拟光驱服务器
- 在shell中向应用程序的socket发送信息
- 手机b站封面提取网站_二次元之家 视频网站B站上海与北京办公设计欣赏
- 【Python爬虫】:爬取58同城二手房的所有房产标题
- Could not locate call adapter for io.reactivex.Observable
热门文章
- 【linux中Telnet服务的安装】
- 李云大连理工计算机系2015级,大连理工大学计算机科学与技术学院介绍
- openmeetings 安装ssl
- 浅谈HTTP缓存以及后端,前端如何具体实现HTTP缓存
- 洛谷 P2181对角线——排列组合
- PL/SQL-procedure-function-package创建
- oracle计算timestamp差,Oracle 计算timestamp和date类型的时间差
- c语言---图形打印
- 思科SPCCIE必考QOS流量整形traffic shaping原理及配置方法-ielab网络实验室
- caffe之(四)全连接层