算法提高 种树

来源:互联网 发布:显示器颜色测试软件 编辑:程序博客网 时间:2024/05/30 04:32
问题描述
  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
#include <stdio.h>  #define maxValue(a,b) a>b?a:b//int N=30,M=15;      //4286//int Ai[31]={0,166, -994, -440, -865, 1000, 744, 396, -998, 707, 528, 816, 207, 628, 225, 309, -339, 207, -871, -77, -692, 162, 374, -370,-49, 592, 114, -756, 541, 946, -68  };int N=10,M=4;       //1767int Ai[31]={0,33, 100, 453, 828, 28, 145, 286, 391, 303, 403};int down[31];int canDown(int pos){    if(pos==N) if(down[1]==1)  return 0;else if(down[pos+1]==1) return 0;if(pos==1) if(down[N]==1) return 0;else if(down[pos-1]==1) return 0;return 1;}int fun(int m,int start){   int i,max=-99999;   if(m>M||start>N) return 0;    for(i=start;i<=N-2*(M-m);i++){   if(canDown(i)){           down[i]=1;   max=maxValue(max,fun(m+1,i+2)+Ai[i]);   down[i]=0;   }   }   return max;}int main()  {      int i,max=0;    scanf("%d%d",&N,&M);    for(i=1;i<=N;i++) scanf("%d",&Ai[i]); /*   */ //   printf("max:%d\n",maxValue(11,9)); /*    for(i=1;i<=N;i++) printf("%d   ",Ai[i]);    printf("\n");      */    if(M<=N/2){        max=fun(1,1);    printf("%d\n",max);    //15    4286}else    printf("Error!\n");return 0;}  

0 0
原创粉丝点击