code
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
const int MIN=-0x3f3f3f3f,maxn=35;
int N,M,val[maxn],dp[maxn][maxn];
int solve(){
for(int i=1;i<=M-1;++i){
dp[1][i]=dp[2][i]=MIN;
}
for(int i=3;i<N;++i){
for(int j=1;j<=M-1;++j){
dp[i][j]=max(dp[i-2][j-1]+val[i],dp[i-1][j]);
}
}
int ans1=dp[N-1][M-1]+val[1];
memset(dp,0,sizeof(dp));
for(int i=1;i<M+1;++i){
dp[0][i]=dp[1][i]=MIN;
}
for(int i=2;i<=N;++i){
for(int j=1;j<=M;++j){
dp[i][j]=max(dp[i-2][j-1]+val[i],dp[i-1][j]);
}
}
int ans2=dp[N][M];
return ans1>ans2?ans1:ans2;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>N>>M;
for(int i=1;i<=N;++i){
cin>>val[i];
}
if(M>N/2){
cout<<"Error!";
return 0;
}
cout<<solve();
return 0;
}
Q
资源限制
时间限制:1.0s 内存限制:256.0MB
种树
问题描述
A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市*决定沿圆形广场外圈种一圈树。园林部门 得到指令后,初步规划出n个种树的位置,顺时针编号1到n。并且每个位置都有一个美观度Ai,如果在这里种树就可以得到这Ai的美观度。但由于A城市土壤 肥力欠佳,两棵树决不能种在相邻的位置(i号位置和i+1号位置叫相邻位置。值得注意的是1号和n号也算相邻位置!)。
最终市*给园林部门提供了m棵树苗并要求全部种上,请你帮忙设计种树方案使得美观度总和最大。如果无法将m棵树苗全部种上,给出无解信息。
输入格式
输入的第一行包含两个正整数n、m。
第二行n个整数Ai。
输出格式
输出一个整数,表示最佳植树方案可以得到的美观度。如果无解输出“Error!”,不包含引号。
样例输入
7 3
1 2 3 4 5 6 7
样例输出
15
样例输入
7 4
1 2 3 4 5 6 7
样例输出
Error!
数据规模和约定
对于全部数据,满足1<=m<=n<=30;
其中90%的数据满足m<=n<=20
-1000<=Ai<=1000