给定N个整数A1, A2, ... AN。请你从中选出K个数,使其乘积最大。
请你求出最大的乘积,由于乘积可能超出整型范围,你只需输出乘积除以1000000009的余数。
注意,如果X<0, 我们定义X除以1000000009的余数是负(-X)除以1000000009的余数。
即:0-((0-x) % 1000000009)【输入格式】
第一行包含两个整数N和K。
以下N行每行一个整数Ai。对于40%的数据,1 <= K <= N <= 100
对于60%的数据,1 <= K <= 1000
对于100%的数据,1 <= K <= N <= 100000 -100000 <= Ai <= 100000【输出格式】
一个整数,表示答案。
【输入样例】
5 3
-100000
-10000
2
100000
10000【输出样例】
999100009再例如:
【输入样例】
5 3
-100000
-100000
-2
-100000
-100000【输出样例】
-999999829
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
dp[i][j] : 从前j个数中选出i个数可获得的最大乘积,i <= j
当 i==1时,dp[i,j] = max(dp[i,j-1],a[i]);
当i>1时,dp[i,j] = max(dp[i-1,j-1]*a[j] , dp[i,j-1])
求边界值时,一定要把握住i<=j的限定条件,不满足这个条件的没有讨论的意义。
注意题目要求获得较大值后再取模,不是获得取模后的较大值。
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <cmath>
#include <algorithm>
#include <set>
#include <queue>
#include <string>
#include <map>
#define MAXN 100004
#define MOD 1000000009
#define INF 0x7ffffff
#define ABS(x) -(abs(x)%MOD)
#define JUDGE(x) (x < 0 ? ABS(x) : x%MOD)
using namespace std;
long long dp[3][MAXN];
long long a[MAXN];
int main(){
int n,k;
scanf("%d%d",&n,&k);
// init();
for(int i=1;i<=n;++i){
scanf("%lld",&a[i]);
}
for(int i=1;i<=n;++i){
if(i == 1){
dp[1][i] = JUDGE(a[i]);
}
else dp[1][i] = max(JUDGE(dp[1][i-1]),JUDGE(a[i]));
}
for(int i=2;i<=k;++i){
for(int j=i;j<=n;++j){
if(j == i){
dp[2][j] = JUDGE(dp[1][j-1]*a[j]);
}
else{
if(dp[1][j-1]*a[j] > dp[2][j-1]){
dp[2][j] = JUDGE(dp[1][j-1]*a[j]);
}
else dp[2][j] = JUDGE(dp[2][j-1]);
// dp[2][j] = max(JUDGE(dp[1][j-1]*a[j]),JUDGE(dp[2][j-1]));
// dp[2][j] = JUDGE(dp[2][j]);
}
}
for(int ii=i;ii<=n;++ii){
dp[1][ii] = dp[2][ii];
}
}
cout << dp[2][n] << endl;
return 0;
}