题解 | #合唱团#
合唱团
https://www.nowcoder.com/practice/661c49118ca241909add3a11c96408c8
#include <iostream>
#include <vector>
using namespace std;
struct XPower
{
XPower()
{
}
//正数
long long n = 0;
//负数
long long f = 0;
};
long long GetMax(vector<int>& power,int n,int k, int d)
{
vector<vector<XPower>> dp(k,vector<XPower>(n));
for(int i = 0;i<n;i++)
{
if(power[i]>=0)
dp[0][i].n = power[i];
else
dp[0][i].f = power[i];
}
for(int i = 1;i<k;i++)
{
for(int j = i;j<n;j++)
{
for(int l = j-1;l>=0&&j-l<=d;l--)
{
if(power[j]>=0)
{
dp[i][j].n = max(dp[i][j].n,dp[i-1][l].n*power[j]);
dp[i][j].f = min(dp[i][j].f,dp[i-1][l].f*power[j]);
}
else
{
dp[i][j].n = max(dp[i][j].n,dp[i-1][l].f*power[j]);
dp[i][j].f = min(dp[i][j].f,dp[i-1][l].n*power[j]);
}
}
}
}
long long ans = 0;
for(int i = 0;i<n;i++)
{
ans = max(ans,dp[k-1][i].n);
}
return ans;
}
int main() {
int n;
while (cin >>n) { // 注意 while 处理多个 case
vector<int> power(n,0);
for(int i = 0;i<n;i++)
{
cin>>power[i];
}
int k,d;
cin>>k>>d;
cout<<GetMax(power,n,k,d);
}
}
// 64 位输出请用 printf("%lld")
思路还是比较简单,动态规划设置dp数组,dp[k][n],表示在选第k个人时,选到n的最大值(或最小,因为能力值可以为负),注意答案的值比较大,如果使用int会导致溢出,需要使用long long

