解题思路:
简单暴力
注意事项:
位置的合理性判断

代码只是参考  有优化空间


参考代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 30+5;
int n,m,mx = 0;
int sum = 0;
int a[N],vs[N];//vs[i]=1表示第i处种植树 

bool check(int x,int y){//x是现在种树的位置, y是下一棵树的位置
//检验y是否合理 
    if(abs(x-y)<=1||(x==1&&vs[n]==1)||(x==n&&vs[1]==1)
    ||(y==1&&vs[n]==1)||(y==n&&vs[1]==1)){
//x,y不能相邻  x,y为首(尾)时判断 尾(首) 是否种树,有种就不允许 
        return false;
    }
    return true;//合理 
}

void dfs(int x,int v){//x表示上一棵树的位置v表示种了几个树 
    if(v==m){//已经种满了m个树 
        mx = max(mx,sum);//记录最大值 并返回 
        return;
    }
    for(int i = x;i<=n;i++){//继续遍历后面位置 看那些位置可以种树 
        if(check(x,i)&&!vs[i]){//i位置合理且没有种树 
            sum += a[i];//加上美观度 
            vs[i] = 1;//种树标记 
            dfs(i,v+1);//深入遍历 
            vs[i] = 0;//标记恢复 
            sum -= a[i];//美观度恢复 
        }
    }
}

void solve(){
    cin>>n>>m;
    
    
    for(int i = 1;i<=n;i++){
        cin>>a[i];
    }
    
    for(int i = 1;i<=n;i++){//以每一个位置为起点 去循环遍历
        sum = a[i];//首先加上起点美观度 
        memset(vs,0,sizeof(vs));//初始化种树标记 
        vs[i]=1;//起点种树 
        dfs(i,1);//继续遍历    
    }
    if(mx==0) cout<<"Error!";
    else cout<<mx;

}

int main(){ 
    solve();
    return 0;
}


点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论