题目链接:http://hihocoder.com/problemset/problem/1609

题解:就先拿一个数组最多分成两部分来说吧

8

1 2 3 4 5 1 2 3

显然 输出时2 3

可以这样分(1 2 3( 4 5 )1 2 3)显然分要分在(^4^5^)“^”这3个地方也就是说如果设pre[i]表示i位置最前面能到哪个位置,dp[i]表示i这个位置最少能分成几组。

那么ans[i]=Sum(ans[j] , (dp[j]=dp[i]-1 && j > pre[i]))那么就可以考虑前缀和。如果是单纯的求i的前缀没什么意义,可以考虑球sum[dp[i]]表示到i的位置长度为dp[i]

的一共有几种分法。这样就可以方便求出Sum(ans[j] , (dp[j]=dp[i]-1 && j > pre[i]))

#include <iostream>
#include <cstring>
#include <cstdio>
#define mod 1000000007
using namespace std;
const int M = 1e5 + ;
typedef long long ll;
int a[M] , pre[M] , dp[M];
ll ans[M] , sum[M];
bool vis[M];
int main() {
int n;
scanf("%d" , &n);
for(int i = ; i < n ; i++) {
scanf("%d" , &a[i]);
}
memset(pre , - , sizeof(pre));
memset(dp , - , sizeof(dp));
memset(vis , false , sizeof(vis));
int left = -;
for(int i = ; i < n ; i++) {
if(vis[a[i]]) {
left++;
while(a[i] != a[left]) {
vis[a[left]] = false;
left++;
}
}
pre[i] = left;
vis[a[i]] = true;
}
for(int i = ; i < n ; i++) {
if(pre[i] == -) {
dp[i] = ;
}
else {
if(dp[i] == -) dp[i] = dp[pre[i]] + ;
else dp[i] = min(dp[i] , dp[pre[i]] + );
}
}
for(int i = ; i < n ; i++) {
if(pre[i] == -) {
ans[i] = ;
sum[dp[i]] += ans[i];
sum[dp[i]] %= mod;
}
else {
for(int j = max( , pre[i - ]) ; j < pre[i] ; j++) {
sum[dp[j]] -= ans[j];
sum[dp[j]] %= mod;
}
ans[i] += sum[dp[i] - ];
sum[dp[i]] += ans[i];
sum[dp[i]] %= mod;
}
}
printf("%d %lld\n" , dp[n - ] , (ans[n - ] + mod) % mod);
return ;
}

hihocoder #1609 : 数组分拆II(思维)的更多相关文章

  1. hihocoder offer收割编程练习赛8 C 数组分拆

    思路:(引自bfsoyc的回答:http://hihocoder.com/discuss/question/4160) 动态规划.状态dp[i]表示 前i个数的合法的方案数,转移是 dp[i] = s ...

  2. 【hihocoder 1475】 数组分拆

    [题目链接]:http://hihocoder.com/problemset/problem/1475 [题意] _< [题解] /* 别人的题解 首先对于每个位置预处理数组的前缀和,即s[i] ...

  3. HihoCoder 1496:寻找最大值(思维DP)

    http://hihocoder.com/problemset/problem/1496 题意:中文. 思路:一开始做有一种想法,把所有的数都变成二进制后,最优的情况肯定是挑选所有数中最高位的1能同时 ...

  4. hihoCoder #1646 : Rikka with String II(容斥原理)

    题意 给你 \(n\) 个 \(01\) 串 \(S\) ,其中有些位置可能为 \(?\) 表示能任意填 \(0/1\) .问对于所有填法,把所有串插入到 \(Trie\) 的节点数之和(空串看做根节 ...

  5. [BZOJ2734][HNOI2012] 集合选数(状态压缩+思维)

    Description 题目链接 Solution 可以根据条件构造出一个矩阵, 1 3 9 27 81... 2 6 18.... 4 12 36... 这个矩阵满足\(G[i][1]=G[i-1] ...

  6. BZOJ 1594: [Usaco2008 Jan]猜数游戏 线段树 + 思维 + 二分

    Code: #include<bits/stdc++.h> #define maxn 3000000 using namespace std; void setIO(string s) { ...

  7. 【hihocoder 1519】 逃离迷宫II

    [题目链接]:http://hihocoder.com/problemset/problem/1519?sid=1098756 [题意] Chinese [题解] bfs题; 根据bfs的性质; 第一 ...

  8. 北京2018网络赛 hihocoder#1828 : Saving Tang Monk II (BFS + DP +多开一维)

    hihocoder 1828 :https://hihocoder.com/problemset/problem/1828 学习参考:https://www.cnblogs.com/tobyw/p/9 ...

  9. POJ 3422 矩阵取数 最小费用流拆点+负边

    Kaka's Matrix Travels Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9153   Accepted:  ...

随机推荐

  1. Java集合系列(一)List集合

    List的几种实现的区别与联系 List主要有ArrayList.LinkedList与Vector几种实现. ArrayList底层数据结构是数组, 增删慢.查询快; 线程不安全, 效率高; 不可以 ...

  2. 前端本地proxy跨域代理配置

    等了好久的接口,总算拿到了,结果却发现用本地localhost:9712去请求接口的时候,出现了跨域错误,而这个时候我们就需要进行下跨域配置了. 首先,找到项目中名为webpack.config.js ...

  3. Unity经典游戏教程之:雪人兄弟

    版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客&qu ...

  4. 使用 OpenSSL 为 Nginx 创建自签名证书 并开启客户端身份验证

    本文章默认读者了解Openssl,CA,网站证书相关知识,直接实战!配置完成后,浏览器会显示"安全的HTTPS"连接.不会像其他文章那样,是红色警告的证书提示. 准备环境 笔者使用 ...

  5. Keil5调试过程中遇到的一些警告和错误

    最近用keil5调试代码出了一些警告与错误,整理如下: 1.warning: #1295-D: Deprecated declaration run_c - give arg types void r ...

  6. Serilog 自定义Enricher 来增加记录的信息

    Serilog 自定义Enricher 来增加记录的信息 Intro Serilog 是 .net 里面非常不错的记录日志的库,结构化日志记录,而且配置起来很方便,自定义扩展也很方便 Serilog ...

  7. JavaWeb——使用会话维持状态

    1.会话的作用 使用会话是为了维持状态,维持的是请求域请求之间的状态.因为HTTP请求自身是完全无状态的.从服务器的角度来看,当用户发出第一个请求开始,服务器无法将新的请求与之前的请求关联起来,举例说 ...

  8. 算法之《图》Java实现

    数据结构之图 定义(百度百科) 图的术语表 无向图 深度优先搜索 广度优先遍历 有向图 路径问题 调度问题 强连通性 最小生成树(无向图) 最小生成树的贪心算法 加权无向图的数据结构 Kruskal算 ...

  9. 帝国CMS(EmpireCMS) v7.5后台任意代码执行

    帝国CMS(EmpireCMS) v7.5后台任意代码执行 一.漏洞描述 EmpireCMS 7.5版本及之前版本在后台备份数据库时,未对数据库表名做验证,通过修改数据库表名可以实现任意代码执行. 二 ...

  10. RDIFramework.NET敏捷开发框架通过SignalR技术整合即时通讯(IM)

    1.引言 即时通讯(IM)是RDIFramework.NET敏捷开发框架全新提供的一个基于Web的即时通讯.内部聊天沟通的工具.界面美观大方对于框架内部进行消息的沟通非常方便.基于RDIFramewo ...