合唱团 (线性dp)
题意:有 n 个学生站成一排,每个学生有一个能力值,牛牛想从这 n 个学生中按照顺序选取 k 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 k 个学生的能力值的乘积最大,你能返回最大的乘积吗?
思路:表示在i个位置选了j人的最大乘积,表示在i个位置选了j人的最小乘积。为什么要记录最小乘积?因为每个学生的能力值可能为正可能为负,那么必须保存最小乘积,才能保证不遗漏负数相乘的情况。
AC代码
#include <stdio.h>
#include <algorithm>
using namespace std;
#define inf 1e14
typedef long long LL;
typedef pair<LL, LL> pii;
const int maxn = 50+5;
//d(i, j, 1)表示在i个位置选了j人的最大乘积
//d(i, j, 1)表示在i个位置选了j人的最小乘积
LL dp[maxn][15][2];
int a[maxn];
int main() {
int n, cnt, d;
while(scanf("%d", &n) == 1) {
for(int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
dp[i][1][1] = dp[i][1][0] = a[i];
}
scanf("%d%d", &cnt ,&d);
for(int i = 1; i <= n; i++) {
for(int j = 2; j <= min(cnt, i); j++) {
dp[i][j][1] = -inf,
dp[i][j][0] = inf;
for(int k = i-1; k > 0 && k >= i-d && k >= j-1; k--) {
for(int q = 0; q < 2; q++) {
dp[i][j][1] = max(dp[i][j][1], dp[k][j-1][q] * a[i]);
dp[i][j][0] = min(dp[i][j][0], dp[k][j-1][q] * a[i]);
}
}
}
}
LL ans = -inf;
for(int i = cnt; i <= n; i++) {
ans = max(ans, dp[i][cnt][1]);
}
printf("%lld\n", ans);
}
return 0;
}
如有不当之处欢迎指出!
合唱团 (线性dp)的更多相关文章
- LightOJ1044 Palindrome Partitioning(区间DP+线性DP)
问题问的是最少可以把一个字符串分成几段,使每段都是回文串. 一开始想直接区间DP,dp[i][j]表示子串[i,j]的答案,不过字符串长度1000,100W个状态,一个状态从多个状态转移来的,转移的时 ...
- Codeforces 176B (线性DP+字符串)
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...
- hdu1712 线性dp
//Accepted 400 KB 109 ms //dp线性 //dp[i][j]=max(dp[i-1][k]+a[i][j-k]) //在前i门课上花j天得到的最大分数,等于max(在前i-1门 ...
- 动态规划——线性dp
我们在解决一些线性区间上的最优化问题的时候,往往也能够利用到动态规划的思想,这种问题可以叫做线性dp.在这篇文章中,我们将讨论有关线性dp的一些问题. 在有关线性dp问题中,有着几个比较经典而基础的模 ...
- POJ 2479-Maximum sum(线性dp)
Maximum sum Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 33918 Accepted: 10504 Des ...
- poj 1050 To the Max(线性dp)
题目链接:http://poj.org/problem?id=1050 思路分析: 该题目为经典的最大子矩阵和问题,属于线性dp问题:最大子矩阵为最大连续子段和的推广情况,最大连续子段和为一维问题,而 ...
- nyoj44 子串和 线性DP
线性DP经典题. dp[i]表示以i为结尾最大连续和,状态转移方程dp[i] = max (a[i] , dp[i - 1] + a[i]) AC代码: #include<cstdio> ...
- 『最大M子段和 线性DP』
最大M子段和(51nod 1052) Description N个整数组成的序列a[1],a[2],a[3],-,a[n],将这N个数划分为互不相交的M个子段,并且这M个子段的和是最大的.如果M &g ...
- 『最长等差数列 线性DP』
最长等差数列(51nod 1055) Description N个不同的正整数,找出由这些数组成的最长的等差数列. 例如:1 3 5 6 8 9 10 12 13 14 等差子数列包括(仅包括两项的不 ...
随机推荐
- mysql5.7安装配置,常用命令,常见问题
1.安装配置 参考:http://www.cnblogs.com/Fiona20170420/p/6738185.html 1. 下载 2. 解压缩 3. 添加path环境变量,路径指向mysql所在 ...
- Android内核三大核心功能之一AMS内部原理
上面类是AmS的全称,另外两大核心功能是WindowManagerService.java和View.java AmS提供的主要功能: 统一调度各应用程序 内存管理 进程管理 AmS中定义了几个重要的 ...
- 权限问题导致zabbix无法监控mysql
说说一个困扰自已两天的问题. 首先是用常规的方法安装上了mysql数据库.做了主从. 在监控从库的时候,发现所有的监控数据库的监控项都获取不到key值 . zabbix server端也不报错.获取到 ...
- 谈一谈jQuery核心架构设计(转)
jQuery对于大家而言并不陌生,因此关于它是什么以及它的作用,在这里我就不多言了,而本篇文章的目的是想通过对源码简单的分析来讨论 jQuery 的核心架构设计,以及jQuery 是如何利用javas ...
- ResultSet详细
1. ResultSet细节1功能:封锁结果集数据操作:如何获得(取出)结果 package com.sjx.a; import java.sql.Connection; import java.sq ...
- C++的string类
关于头文件cstring,提供了strlen及很多与字符串相关的函数的声明. 头文件string,要使用string类,必须在程序中包含头文件string,string类位于std中,必须提供一条us ...
- Spring Boot 使用maven打包成jar
1.application.properties加入如下配置 server.port= 2.修改pom.xml <?xml version="1.0" encoding=&q ...
- File类中的list和listFiles方法
File类中的list和listFiles方法 list()方法是返回某个目录下的所有文件和目录的文件名,返回的是String数组 listFiles()方法是返回某个目录下所有文件和目录的绝对路径, ...
- JAVA泛型使用方法总结
1. 基本概念: (1)什么是泛型? 泛型,即"参数化类型".即将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用或 ...
- github上最好的开源MMORPG - stendhal
Stendhal is a fully fledged multiplayer online adventures game (MORPG). It is completely open source ...