【bzoj4513】储能表【数位DP】
2024-08-28 16:40:47
本来是想去学数位DP,作死挑了这道题,爆炸。。。
听说正确姿势应该是去做bzoj4521【手机】,听说迪克们当场都A了,Orz
然后对于4513,我只想说,一、脸、懵、逼
首先,我是无论如何都无法想到f[i][x][y][z]精妙的表示方式的
……讲不下去了,搬来罗爷爷的blog救场http://yyhslyz.is-programmer.com/posts/199294.html
好吧我承认这道题我完全没理解。。。。
代码可以看lych的blog.
不过其中又get了一个bug,原来<的优先级大于^,2333
-----------------------------------------------
首先,数位dp是啥.
它一般与二进制,异或有关,有些比较容易看出来,有些并不.
解决问题的核心思想就是逐位确定.
我还是想再说一遍,感觉自己做dp题还是没有任何的长进,可能弱菜看过的题太少.
#include<cstdio> #include<algorithm> #include<cstring> #define N 105 #define ad add #define ll long long using namespace std; ll n,m,k,T; ll p,lenm,lenn,lenk,tmp,len,a[N],b[N],c[N],f[N][][][],g[N][][][],bin[N]; void add(ll &x,ll y) { x+=y;if(x>=p)x-=p; } ll max(ll a,ll b) { if(a>b) return a;else return b; } int main() { scanf("%d",&T); while(T--) { scanf("%lld%lld%lld%lld",&m,&n,&k,&p); memset(a,,,,sizeof(c)); lenm=;)a[++lenm]=m&; lenn=;)b[++lenn]=n&; lenk=;)c[++lenk]=k&; len=max(max(lenm,lenn),lenk); bin[]=;;i<=len;i++)bin[i]=(bin[i-]<<)%p; memset(f,,,sizeof(g)); ; x<; x++) ; y<; y++) ; z<; z++) ; u<((x)?:a[]); u++) ; v<((y)?:b[]); v++) ] || z){ ad(f[][x][y][z],((u^v)-c[]+p)%p); ad(g[][x][y][z],); } ; i<=len; i++) ; x<; x++) ; y<; y++) ; z<; z++) ; u<=max(x,a[i]); u++) ; v<=max(y,b[i]); v++) if ((u^v)>=c[i] || z){ int j=x|(u<a[i]),k=y|(v<b[i]),l=z|((u^v)>c[i]); tmp=(ll)g[i-][j][k][l]*((u^v)-c[i])*bin[i-]%p; ) tmp+=p; ad(tmp,f[i-][j][k][l]); ad(f[i][x][y][z],tmp); ad(g[i][x][y][z],g[i-][j][k][l]); } printf(][][]); } }
2016/06/01
[bzoj4521]
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long #define mo 998244353 using namespace std; ll x,y,n,dp[][][][][][][]; ]; ll solve(ll x) { n=;int p,q,r; while(x) { a[++n]=x%;x/=; } ); ;i<=n/;i++)swap(a[i],a[n-i+]); memset(dp,,sizeof(dp)); ;i<a[];i++) ;j<=;j++){ ||j==)p=;; ||j==)q=;; dp[][i][j][p][q][][]=; } ;j<a[];j++){ ]==||j==)p=;; ]==||j==)q=;; dp[][a[]][j][p][q][][]=; } ]==||a[]==)p=;; ]==||a[]==)q=;; dp[][a[]][a[]][p][q][][]=; ;i<n;i++) ;j<=;j++) ;k<=;k++) ;I<=;I++) ;J<=;J++) ;K<=;K++) ;l<=;l++){ )p=;else p=I; )q=;else q=J; ;else r=K; dp[i+][k][l][p][q][r][]+=dp[i][j][k][I][J][K][]; ])dp[i+][k][l][p][q][r][]+=dp[i][j][k][I][J][K][]; ])dp[i+][k][l][p][q][r][]+=dp[i][j][k][I][J][K][]; } ll ans=; ;i<=;i++) ;j<=;j++) ;k<=;k++) ans+=dp[n][i][j][][][][k]+dp[n][i][j][][][][k]+dp[n][i][j][][][][k]; return ans; } int main() { scanf("%lld%lld",&x,&y); printf()); }
最新文章
- 编写自己的PHP MVC框架笔记
- windows7 64位下环境搭建scrapy爬虫框架
- vim技巧
- Office 365 系列三 ------ 创建Office 365普通账号
- artdialog4.1.7 中父页面给子页面传值
- Populating Tree Item With Record Group In Oracle Forms
- VMware中安装CentOS7网络配置静态IP地址,常用配置和工具安装
- Spring MVC 的汉字乱码问题
- 哈理工软件学院";兆方美迪";杯第六届程序设计大赛【高年级组】--决赛 题解
- 党建凯,创新工场知乎团队Web前端工程师
- Spring.net-业务层仓储
- 《Android进阶》之第七篇 NDK的使用
- 数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)
- Android新建工程步骤(AndroidStudio)
- JavaScript构造函数
- Think_in_java_4th(并发学习二)
- 利用jQuery如何获取当前被点击的按钮
- PHP中require(),include(),require_once()和include_once()有什么区别
- Linux下自动清理超过指定大小文件的方法
- 网易云复盘:云计算前端这一年(AngularJS粉慎入)
热门文章
- 【XLL API 函数】 xlFree
- osg 纹理访问器
- September 12th 2016 Week 38th Monday
- linux crontab 学习
- Stanford大学机器学习公开课(四):牛顿法、指数分布族、广义线性模型
- Eclipse 控制console
- Android ANR分析(三)
- 第一部分:使用iReport制作报表的详细过程(Windows环境下)
- HP SAN Switch光纖交換機命令行畫zone
- uint8_t / uint16_t / uint32_t /uint64_t 是什么数据类型 - 大总结,看完全明白了