DAY3 - T2 保卫地球

T2:保卫地球

题目

题目描述

北蚤想创建完银河战队,要用它保护地球
现在有一个长度为 n 的数组,将其分成 k 部分 记每段的最小值为 b1,b2...,bk
先要使得 b1b2+b1b3+...+b1bk+b2b3+b2b4+...+...+bk-1bk 最大

输入

输入文件为 protect.in。 第一行包含两个整数 n,k 第二行包含 n 个整数

输出

输出文件为 protect.out。
共一行一个数

样例

数据

20%      k = 2
30%      n <= 10
100%    n <= 20,  k <= 7

题解

DFS
#include<bits/stdc++.h>
using namespace std;

int a[51], b[51], c[51], ans_, n, k;

void dfs(int x, int y){
    if(y == k + 1){
        if(x == n + 1){
            for(int i = 1; i <= k; i++){
                int now = 1e9;
                for(int j = b[i-1] + 1; j <= b[i]; j++){
                    now = min(now, a[j]);
                }
                c[i] = now;
            }
            int ans = 0;
            for(int i = 1; i <= k; i++){
                for(int j = i + 1; j <= k; j++){
                    ans += c[i]*c[j];
                }
            }
            if(ans > ans_){
                ans_ = ans;
            }
        }
    }
    for(int i = x; i <= n; i++){
        b[y] = i;
        dfs(i+1, y+1);
    }
}

int main(){
    scanf("%d%d", &n, &k);
    for(int i = 1; i <= n; i++){
        scanf("%d", &a[i]);
    }
    dfs(1, 1);
    printf("%d\n", ans_);
    return 0;
}
posted @ 2020-08-05 11:24  LT-Y  阅读(98)  评论(0)    收藏  举报