hihocoder offer收割编程练习赛8 C 数组分拆
2024-09-30 09:21:21
思路:(引自bfsoyc的回答:http://hihocoder.com/discuss/question/4160)
动态规划。状态dp[i]表示 前i个数的合法的方案数,转移是
dp[i] = sum{ dp[k] | 1 < k < i && sum(k+1,i)!=0 }
= sum{ dp[k] | 1 < k < i } - sum{ dp[k] | 1 < k < i && sum(k+1,i)==0 }
关键是求后半部分怎么找到sum(k+1,i)==0 的k, 等价于找 prefixSum(k)== prefixSum(i),因为这里前缀比后缀维护容易。利用容器map M, M[ps] = sum{dp[k] | prefixSum(k)==ps }。 那么 dp[i] = sum{ dp[k] | 1 < k < i } - M[prefixSum(i)]。
实现:
#include <iostream>
#include <cstdio>
#include <map>
using namespace std; const int mod = 1e9 + ;
int a[], s[], dp[], n, total;
map<int, int> g; int solve()
{
total = dp[] = ;
g[] = ;
for (int i = ; i <= n; i++)
{
if (!g.count(s[i]))
g[s[i]] = ;
dp[i] = ((total - g[s[i]]) % mod + mod) % mod;
g[s[i]] = (g[s[i]] + dp[i]) % mod;
total = (total + dp[i]) % mod;
}
return dp[n];
} int main()
{
cin >> n;
for (int i = ; i <= n; i++)
{
scanf("%d", &a[i]);
s[i] = s[i - ] + a[i];
}
cout << solve() << endl;
return ;
}
最新文章
- ASP.NET关于对excel数据导入到数据库
- [Tomcat 源码分析系列] (二) : Tomcat 启动脚本-catalina.bat
- CPU informition
- druid 源码分析与学习(含详细监控设计思路的彩蛋)(转)
- 成功移植SQLite3到ARM Linux开发板
- UVA 11426 GCD-Extreme(II) ★ (欧拉函数)
- C++ - 内置类型的最大值宏定义
- c#一个简单的实例告诉你,多继承还可以这么来
- IIS7和Tomcat7整合,即IIS7和Tomcat共用80端口
- 「mysql优化专题」你们要的多表查询优化来啦!请查收(4)
- Oracle数据文件丢失,数据库如何打开或恢复
- (八) Usb摄像头描述符解析
- 读取FTP 图片文件,并显示,非下载
- Spring-Cloud-Netflix
- VirtualBox虚拟机网络设置说明
- ztree实现中国省市区树形,可多选
- solr(五): centos中, 整合 tomcat&;solr
- 最简单的HashMap底层原理介绍
- 关于git中Pageant开机启动且自动关联秘钥
- 分享:Oracle 系统变量函数用法说明
热门文章
- Python作业之购物商城
- CodeForces-816B:Karen and Coffee (简单线段树)
- vue之安装配置
- centos7 &;&; centos6.5部KVM使用NAT联网并为虚拟机配置firewalld &;&; iptables防火墙端口转发
- bzoj4516
- vs2008打开类视图,看不到类的解决方法
- iOS---UICollectionView Class Reference---UICollectionView 类参考文档
- 基于事件驱动机制,在Service Mesh中进行消息传递的探讨
- HDOJ5020【几何】
- POJ3186【区间DP】