题目: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[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相关推荐

  1. 【BZOJ4069】[Apio2015]巴厘岛的雕塑 按位贪心+DP

    [BZOJ4069][Apio2015]巴厘岛的雕塑 Description 印尼巴厘岛的公路上有许多的雕塑,我们来关注它的一条主干道. 在这条主干道上一共有 N 座雕塑,为方便起见,我们把这些雕塑从 ...

  2. Bzoj4069:[Apio2015]巴厘岛的雕塑:dp+贪心

    题目链接:[Apio2015]巴厘岛的雕塑 一开始先写了个既错误又高复杂度的dp,令dp[i][j]=min(dp[i][k],dp[j][k-1]|(s[i]-s[j])),其中s[]代表前缀和 首 ...

  3. 【BZOJ4069】【APIO2015】巴厘岛的雕塑 [贪心][DP]

    巴厘岛的雕塑 Time Limit: 10 Sec  Memory Limit: 64 MB [Submit][Status][Discuss] Description 印尼巴厘岛的公路上有许多的雕塑 ...

  4. [APIO2015]巴厘岛的雕塑(数位dp)

    [题解] 引用ZYF神犇一句话:"显然位运算的极值问题都应该从高位向低位考虑.优先让这一位为0,如果行的话这一位就是0,否则就设为1." 设答案为ans,从高位到低位枚举 是否有使 ...

  5. 4069: [Apio2015]巴厘岛的雕塑 DP+按位贪心

    去年的我对位运算一无所知..所以在考场上直接没敢看题..之后据说搜索有分,错的DP有分.我的内心是崩溃的..然而就算看了题还是什么都不会写. 考虑按位贪心,从高位到低位枚举,用 fi,j f_{i,j ...

  6. [APIO2015]巴厘岛的雕塑[按位贪心+dp]

    题意 给你长度为 \(n\) 的序列,要求分成 \(k\) 段连续非空的区间,求所有区间和的 \(or\) 最小值. 分析 定义 \(f_{i,j}\) 表示前 \(i\) 个点分成 \(j\) 段的 ...

  7. P3646 [APIO2015]巴厘岛的雕塑

    非常好的二进制dp题 参考了这位大佬的思路:https://www.cnblogs.com/zbtrs/p/8495170.html #include<iostream> #include ...

  8. 【bzoj 1833】【codevs 1359】 [ZJOI2010]count 数字计数(数位dp)

    1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MB Submit: 2774  Solved: 1230 [Submit ...

  9. 不要62 ---数位DP

    题意:求m到n中不含62和4的数的个数. 题目链接 思路:数位dp模板求满足的数字或不满足的数字,刚学,就求不满足的数. #include<stdio.h> #include<str ...

最新文章

  1. 物联网技术在智能医疗领域的应用与发展
  2. Oracle 12c coming soon?
  3. 若要加载模块二进制_春哥说 | 浅谈NodeJs的模块机制-2
  4. WPF 3D 学习 - 3D材质初步
  5. s8050三极管经典电路_浅谈电路的PSRR(电源纹波抑制比)
  6. C++中WSAAsyncSelect模型的用法例程
  7. cad怎么将图层后置_CAD中如何将某1个图层置于其他图层之上.doc
  8. Mybatis源码之与Spring集成包
  9. php授权验证系统 c,OAuth 2.0 授权码认证
  10. [转]使用jQuery获取radio/checkbox组的值的代码收集
  11. diskgenius创建efi分区_DISKGEN 专业版修改硬盘为GPT分区 ESP分区图文教程
  12. 21天jmeter打卡 day1
  13. ortoiseGit--小乌龟git项目
  14. Java-面向对象编程-三大特性之多态
  15. 中投、汇金、四大国有资产管理公司、华融、长城、东方、信达
  16. 虚拟光驱传文件到服务器,虚拟光驱服务器
  17. 在shell中向应用程序的socket发送信息
  18. 手机b站封面提取网站_二次元之家 视频网站B站上海与北京办公设计欣赏
  19. 【Python爬虫】:爬取58同城二手房的所有房产标题
  20. Could not locate call adapter for io.reactivex.Observable

热门文章

  1. 【linux中Telnet服务的安装】
  2. 李云大连理工计算机系2015级,大连理工大学计算机科学与技术学院介绍
  3. openmeetings 安装ssl
  4. 浅谈HTTP缓存以及后端,前端如何具体实现HTTP缓存
  5. 洛谷 P2181对角线——排列组合
  6. PL/SQL-procedure-function-package创建
  7. oracle计算timestamp差,Oracle 计算timestamp和date类型的时间差
  8. c语言---图形打印
  9. 思科SPCCIE必考QOS流量整形traffic shaping原理及配置方法-ielab网络实验室
  10. caffe之(四)全连接层