http://codeforces.com/contest/588/problem/D

感觉吧,这道题让我做,我应该是不会做的。。。

题目大意:给出n,L,K。表示数组的长度为n,数组b的长度为L,定义数组b[i]=a[i%n]。然后数组b的最长的lis为k,问能有几组<=k的lis

条件如下:

①序列长度>=1并且<=k

②序列在每一块长度为n的数组中只能选择一个数,且选择的必须是连续的块

③序列是不严格的单调递增

思路:主要是看这个人的http://m.blog.csdn.net/article/details?id=50589276

大致思路就是:定义dp[K][N](用dp[i][j]描述),表示目前lis的最长长度为i,到第j个数的时候lis总共有几个。然后求出lis以后再利用lis得到答案即可。

代码

//看看会不会爆int! 或者绝对值问题。
#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define ALL(a) a.begin(), a.end()
const int maxn = 1e6 + ;
const LL mod = 1e9 + ;
int n, K;
LL l;
pair<int, int> a[maxn]; int main(){
scanf("%d%lld%d", &n, &l, &K);
for (int i = ; i < n; i++){
int u;
scanf("%d", &u);
a[i] = mk(u, i);
}
sort(a, a + n);
vector<vector<int> > dp(K, vector<int>(n));
for (int i = ; i < n; i++) dp[][i] = ;
for (int i = ; i < K; i++){
int sum = ;
///dp[i][j]表示目前长度为i,在位置j之前的所有的lis的和
///首先,只以i和k转移,找到在一个周期内的
for (int j = , k = ; j < n; j++){
while (k < n && a[k].first <= a[j].first) {
sum = (sum + dp[i - ][k++]) % mod;
}
dp[i][j] = sum;
}
}
/*
for (int i = 0; i < K; i++){
for (int j = 0; j < n; j++){
printf("%d ", dp[i][j]);
}
printf("\n");
}
*/
LL ans = ;
for (int i = ; i < K; i++){
for (int j = ; j < n; j++){
///有l/n段长,后面的这个条件表示最后一个周期能否取到
LL cnt = l / n + (a[j].second < l % n);
if (cnt - i > ){///这里表明块,一共有cnt个,能满足这个长度
ans += (cnt - i) % mod * dp[i][j] % mod;
ans %= mod; }
}
}
printf("%lld\n", ans);
return ;
}

很好的一个dp题目 Codeforces Round #326 (Div. 2) D dp的更多相关文章

  1. Codeforces Round #536 (Div. 2) E dp + set

    https://codeforces.com/contest/1106/problem/E 题意 一共有k个红包,每个红包在\([s_i,t_i]\)时间可以领取,假如领取了第i个红包,那么在\(d_ ...

  2. Codeforces Round #541 (Div. 2) G dp + 思维 + 单调栈 or 链表 (连锁反应)

    https://codeforces.com/contest/1131/problem/G 题意 给你一排m个的骨牌(m<=1e7),每块之间相距1,每块高h[i],推倒代价c[i],假如\(a ...

  3. Codeforces Round #303 (Div. 2) C dp 贪心

    C. Woodcutters time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  4. Codeforces Round #235 (Div. 2) D (dp)

    以为是组合,后来看着像数位dp,又不知道怎么让它不重复用..然后就没思路 了. 其实状压就可以了 状压是可以确定一个数的使用顺序的 利用01也可以确定所有的数的使用以及不重复 dp[i+1<&l ...

  5. Codeforces Round #326 (Div. 2) D. Duff in Beach dp

    D. Duff in Beach Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/588/probl ...

  6. 线段树+dp+贪心 Codeforces Round #353 (Div. 2) E

    http://codeforces.com/contest/675/problem/E 题目大意:有n个车站,每个车站只能买一张票,这张票能从i+1到a[i].定义p[i][j]为从i到j所需要买的最 ...

  7. 严格递增类的dp Codeforces Round #371 (Div. 1) C dp

    http://codeforces.com/contest/713 题目大意:给你一个长度为n的数组,每次有+1和-1操作,在该操作下把该数组变成严格递增所需要的最小修改值是多少 思路:遇到这类题型, ...

  8. Codeforces Round #543 (Div. 2) F dp + 二分 + 字符串哈希

    https://codeforces.com/contest/1121/problem/F 题意 给你一个有n(<=5000)个字符的串,有两种压缩字符的方法: 1. 压缩单一字符,代价为a 2 ...

  9. Codeforces Round #548 (Div. 2) C dp or 排列组合

    https://codeforces.com/contest/1139/problem/C 题意 一颗有n个点的树,需要挑选出k个点组成序列(可重复),按照序列的顺序遍历树,假如经过黑色的边,那么这个 ...

随机推荐

  1. Objective-C和Swift实现单例的几种方式

    在Swift开发中,我们对于跨类调用的变量常量,因为并没有OC中使用的全局头文件中写宏的形式,我们一般采用在类外定义全局变量/常量的形式来跨类调用.而问题在于目前写的项目需要在新添加的OC写的功能模块 ...

  2. Spring框架--AOP编程

    2 手动实现AOP编程 AOP 面向切面的编程, AOP可以实现"业务代码"与"关注点代码"分离 // 保存一个用户 public void add(User ...

  3. NDK常见问题

    1. 忽略编译警告为错误 APP_CPPFLAGS += -Wno-error=format-security 2. android studio 手动编译 __android_log_print 错 ...

  4. 《JavaScript高级程序设计》读书笔记 ---变量、作用域和内存问题小结

    JavaScript 变量可以用来保存两种类型的值:基本类型值和引用类型值.基本类型的值源自以下5种基本数据类型:Undefined.Null.Boolean.Number 和String.基本类型值 ...

  5. scanf函数与scanf_s函数

    ANSI C中没有scanf_s(),只有scanf(),scanf()在读取时不检查边界,所以可能会造成内存泄露.所以vc++2005/2008中提供了scanf_s(),在最新的VS2013中也提 ...

  6. iOS之图文混排

    首先从github下载 https://github.com/wezm/RegexKitLite 导入.h和.m文件后为RegexKitLite.m添加编译标记-fno-objc-arc.添加动态库l ...

  7. JavaScript高级程序设计:第四章

    变量.作用域和内存问题 1.ECMAScript变量可能包含两种不同数据类型的值:基本类型值和引用类型值.基本类型值指的是简单的数据段,引用类型值指的是有多个值构成的对象. 2.动态的属性:定义一个基 ...

  8. hdu_5677_ztr loves substring(回文+二维多重背包)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5677 题意:给你N个串,问能否选出小于K个回文字符串使得选出的字符串的长度之和为L. 题解:很容易想到 ...

  9. 【转】Ecshop 后台增加一个左侧列表菜单menu菜单的方法

    cshop 后台增加一个左侧列表菜单menu菜单需要修改三个文件:/admin/includes/inc_menu.php/admin/includes/inc_priv.php/languages/ ...

  10. MySQL 视图 总结

    什么是视图 视图是从一个或多个表中导出来的表,是一种虚拟存在的表. 视图就像一个窗口,通过这个窗口可以看到系统专门提供的数据. 这样,用户可以不用看到整个数据库中的数据,而之关心对自己有用的数据. 数 ...