传送门

思路

这么一道签到题竟然没切掉真是丢人呢……

首先有一个\(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]相关推荐

  1. 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)

    洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...

  2. 洛谷P4322 最佳团伙(树上dp)

    题目描述 洛谷传送门 题目描述 JSOI 信息学代表队一共有 N 名候选人,这些候选人从 1 到 N 编号.方便起见,JYY 的编号是 0 号.每个候选人都由一位编号比他小的候选人Ri推荐.如果 Ri ...

  3. 洛谷p5465 [PKUSC2018]星际穿越

    [洛谷p5465][PKUSC2018]星际穿越 题面 洛谷 题解 众所周知PKUSC的题大多都不可做,今天好不容易看到1个倍增水题(我猜当时应该全场切了). 我们设\(f[i][j]\)表示\(i\ ...

  4. 洛谷 P3205 [HNOI2010]合唱队(区间dp)

     题目链接: [HNOI2010]合唱队 - 洛谷https://www.luogu.com.cn/problem/P3205  思路: 这题我是看了题解才做出来的,贴一下这位大佬的博客题解 P320 ...

  5. 洛谷P1006 传纸条 (棋盘dp)

    好气,在洛谷上交就过了,在caioj上交就只有40分 之前在51nod做过这道题了. https://blog.csdn.net/qq_34416123/article/details/8180902 ...

  6. 【题解】洛谷P4158 [SCOI2009] 粉刷匠(DP)

    次元传送门:洛谷P4158 思路 f[i][j][k][0/1]表示在坐标为(i,j)的格子 已经涂了k次 (0是此格子涂错 1是此格子涂对)涂对的格子数 显然的是 每次换行都要增加一次次数 那么当j ...

  7. 洛谷 P2657 [SCOI2009] windy数 数位DP

    大家觉得写还可以,可以点赞.收藏.关注一下吧! 也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn 文章目录 P2657 [SCOI2009 ...

  8. [洛谷]P4158 [SCOI2009]粉刷匠 (#线性dp+背包dp)

    题目描述 windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色. 每个格子最多只能被 ...

  9. 洛谷P1140 相似基因【线性dp】

    题目:https://www.luogu.org/problemnew/show/P1140 题意: 给定两串基因串(只包含ATCG),在其中插入任意个'-'使得他们匹配.(所以一共是5种字符) 这5 ...

  10. 洛谷1850(NOIp2016) 换教室——期望dp

    题目:https://www.luogu.org/problemnew/show/P1850 状态里记录的是"上一回有没有申请",而不是"上一回申请成功否",不 ...

最新文章

  1. 调用webservice接口,数据不回滚问题
  2. AMPAS/ASC Common File Format LUT
  3. libxml中用到的Xpath语法说明
  4. MySQL-schema-sync 一款非常好用的 MySQL数据库同步工具
  5. C语言动态库libxxx.so的几种使用方法
  6. webpack 命令
  7. hyperledger fabric PBFT算法简要解析
  8. 【电脑讲解】硬件知识
  9. 手机抓包之fiddler工具使用记录
  10. mysql中.myd文件_MySQL中找不到.myd文件的有关问题
  11. unity制作火焰效果
  12. camera驱动电源配置_[ROS] 安装 USB Camera 驱动并调用
  13. java计算机毕业设计哈尔滨旅游项目推荐平台演示录像2020MyBatis+系统+LW文档+源码+调试部署
  14. 无监督聚类算法该如何评价
  15. 墨刀的html压缩包是什么,墨刀如何使用?(教程介绍)
  16. 数据挖掘竞赛lightgbm通过求最大auc调参
  17. Object常用的几种方法
  18. JavaWeb学习之HttpServletRequest
  19. Fedora更换主题
  20. 在Vue中将文字以语音进行播报

热门文章

  1. SQLite崩溃处理
  2. PAT Basic 1055
  3. 回溯法 子集和问题
  4. Nature communications
  5. 为什么要使用NAS存储设备呢?
  6. [SeLinux]audit2allow安装与使用
  7. VC之获取计算机网卡mac地址
  8. Java错误:找不到或无法加载主类
  9. [转载]PS各个工具的字母快捷键和英文全名
  10. 微信HOOK协议软件,已实现云控,将微信的效率最大化