洛谷P5369 [PKUSC2018]最大前缀和 [DP]
传送门
思路
这么一道签到题竟然没切掉真是丢人呢……
首先有一个\(O(3^n)\)的SB方法,记录\(dp_{S,T}\)表示已经填进去了\(S\),当前最大前缀和集合为\(T\),随便转移。太简单了就不细讲了。
挖掘一下题目的性质:一个序列必然可以被分成两部分:前面的前缀和&后面的部分。
后面的部分满足一个性质:任意前缀和都<0,所以很容易DP。
前面可以考虑每次往数列前面加数,那么就必须要满足原来的数列总和\(\ge 0\),也很容易DP,具体可以见代码。
然后就做完了……我这都不会真是菜死了……
代码
#include<bits/stdc++.h>
clock_t t=clock();
namespace my_std{using namespace std;#define pii pair<int,int>#define fir first#define sec second#define MP make_pair#define rep(i,x,y) for (int i=(x);i<=(y);i++)#define drep(i,x,y) for (int i=(x);i>=(y);i--)#define go(x) for (int i=head[x];i;i=edge[i].nxt)#define templ template<typename T>#define sz 1100000#define mod 998244353lltypedef long long ll;typedef double db;mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());templ inline T rnd(T l,T r) {return uniform_int_distribution<T>(l,r)(rng);}templ inline bool chkmax(T &x,T y){return x<y?x=y,1:0;}templ inline bool chkmin(T &x,T y){return x>y?x=y,1:0;}templ inline void read(T& t){t=0;char f=0,ch=getchar();double d=0.1;while(ch>'9'||ch<'0') f|=(ch=='-'),ch=getchar();while(ch<='9'&&ch>='0') t=t*10+ch-48,ch=getchar();if(ch=='.'){ch=getchar();while(ch<='9'&&ch>='0') t+=d*(ch^48),d*=0.1,ch=getchar();}t=(f?-t:t);}template<typename T,typename... Args>inline void read(T& t,Args&... args){read(t); read(args...);}char __sr[1<<21],__z[20];int __C=-1,__zz=0;inline void Ot(){fwrite(__sr,1,__C+1,stdout),__C=-1;}inline void print(register int x){if(__C>1<<20)Ot();if(x<0)__sr[++__C]='-',x=-x;while(__z[++__zz]=x%10+48,x/=10);while(__sr[++__C]=__z[__zz],--__zz);__sr[++__C]='\n';}void file(){#ifdef NTFOrzfreopen("a.in","r",stdin);#endif}inline void chktime(){#ifndef ONLINE_JUDGEcout<<(clock()-t)/1000.0<<'\n';#endif}#ifdef modll ksm(ll x,int y){ll ret=1;for (;y;y>>=1,x=x*x%mod) if (y&1) ret=ret*x%mod;return ret;}ll inv(ll x){return ksm(x,mod-2);}#elsell ksm(ll x,int y){ll ret=1;for (;y;y>>=1,x=x*x) if (y&1) ret=ret*x;return ret;}#endif
// inline ll mul(ll a,ll b){ll d=(ll)(a*(double)b/mod+0.5);ll ret=a*b-d*mod;if (ret<0) ret+=mod;return ret;}
}
using namespace my_std;int n;
int a[25];
int sum[sz];
ll f[sz],g[sz];ll fac[sz];
void init(){fac[0]=1;rep(i,1,sz-1) fac[i]=fac[i-1]*i%mod;}int main()
{file();init();read(n);rep(i,1,n) read(a[i]);int N=(1<<n)-1;rep(i,0,N) rep(j,0,n-1) if (i>>j&1) sum[i]+=a[j+1];g[0]=1;rep(i,0,N-1) rep(j,1,n) if (!(i>>(j-1)&1)&&sum[i|(1<<(j-1))]<0) (g[i|(1<<(j-1))]+=g[i])%=mod;f[0]=1;rep(i,0,N-1) if (sum[i]>=0)rep(j,0,n-1) if (!(i>>j&1))(f[i|(1<<j)]+=f[i])%=mod;ll ans=0;rep(i,1,N) (ans+=f[i]*g[N^i]%mod*sum[i]%mod)%=mod;cout<<(ans+mod)%mod;return 0;
}
转载于:https://www.cnblogs.com/p-b-p-b/p/10864776.html
洛谷P5369 [PKUSC2018]最大前缀和 [DP]相关推荐
- 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)
洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...
- 洛谷P4322 最佳团伙(树上dp)
题目描述 洛谷传送门 题目描述 JSOI 信息学代表队一共有 N 名候选人,这些候选人从 1 到 N 编号.方便起见,JYY 的编号是 0 号.每个候选人都由一位编号比他小的候选人Ri推荐.如果 Ri ...
- 洛谷p5465 [PKUSC2018]星际穿越
[洛谷p5465][PKUSC2018]星际穿越 题面 洛谷 题解 众所周知PKUSC的题大多都不可做,今天好不容易看到1个倍增水题(我猜当时应该全场切了). 我们设\(f[i][j]\)表示\(i\ ...
- 洛谷 P3205 [HNOI2010]合唱队(区间dp)
题目链接: [HNOI2010]合唱队 - 洛谷https://www.luogu.com.cn/problem/P3205 思路: 这题我是看了题解才做出来的,贴一下这位大佬的博客题解 P320 ...
- 洛谷P1006 传纸条 (棋盘dp)
好气,在洛谷上交就过了,在caioj上交就只有40分 之前在51nod做过这道题了. https://blog.csdn.net/qq_34416123/article/details/8180902 ...
- 【题解】洛谷P4158 [SCOI2009] 粉刷匠(DP)
次元传送门:洛谷P4158 思路 f[i][j][k][0/1]表示在坐标为(i,j)的格子 已经涂了k次 (0是此格子涂错 1是此格子涂对)涂对的格子数 显然的是 每次换行都要增加一次次数 那么当j ...
- 洛谷 P2657 [SCOI2009] windy数 数位DP
大家觉得写还可以,可以点赞.收藏.关注一下吧! 也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn 文章目录 P2657 [SCOI2009 ...
- [洛谷]P4158 [SCOI2009]粉刷匠 (#线性dp+背包dp)
题目描述 windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色. 每个格子最多只能被 ...
- 洛谷P1140 相似基因【线性dp】
题目:https://www.luogu.org/problemnew/show/P1140 题意: 给定两串基因串(只包含ATCG),在其中插入任意个'-'使得他们匹配.(所以一共是5种字符) 这5 ...
- 洛谷1850(NOIp2016) 换教室——期望dp
题目:https://www.luogu.org/problemnew/show/P1850 状态里记录的是"上一回有没有申请",而不是"上一回申请成功否",不 ...
最新文章
- 调用webservice接口,数据不回滚问题
- AMPAS/ASC Common File Format LUT
- libxml中用到的Xpath语法说明
- MySQL-schema-sync 一款非常好用的 MySQL数据库同步工具
- C语言动态库libxxx.so的几种使用方法
- webpack 命令
- hyperledger fabric PBFT算法简要解析
- 【电脑讲解】硬件知识
- 手机抓包之fiddler工具使用记录
- mysql中.myd文件_MySQL中找不到.myd文件的有关问题
- unity制作火焰效果
- camera驱动电源配置_[ROS] 安装 USB Camera 驱动并调用
- java计算机毕业设计哈尔滨旅游项目推荐平台演示录像2020MyBatis+系统+LW文档+源码+调试部署
- 无监督聚类算法该如何评价
- 墨刀的html压缩包是什么,墨刀如何使用?(教程介绍)
- 数据挖掘竞赛lightgbm通过求最大auc调参
- Object常用的几种方法
- JavaWeb学习之HttpServletRequest
- Fedora更换主题
- 在Vue中将文字以语音进行播报