【题目大意】
教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值。 教主最喜欢3种树,这3种树的高度分别为10,20,30。教主希望这一圈树种得有层次感,所以任何一个位置的树要比它相邻的两棵树的高度都高或者都低,并且在此条件下,教主想要你设计出一套方案,使得观赏价值之和最高。
【输入格式】
输入的第1行为一个正整数n,表示需要种的树的棵数。
接下来n行,每行3个不超过10000的正整数ai,bi,ci,按顺时针顺序表示了第i个位置种高度为10,20,30的树能获得的观赏价值。
第i个位置的树与第i+1个位置的树相邻,特别地,第1个位置的树与第n个位置的树相邻。
【输出格式】
输出仅包括一个正整数,为最大的观赏价值和。
【样例输入】
4
1 3 2
3 1 2
3 1 2
3 1 2
【样例输出】
11
【样例说明】
第1~n个位置分别种上高度为20,10,30,10的树,价值最高。
【数据规模】
对于20%的数据,有n≤10;
对于40%的数据,有n≤100;
对于60%的数据,有n≤1000;
对于100%的数据,有4≤n≤100000,并保证n一定为偶数。
【思路】
f[i][0..3]分别表示前i棵树的最大观赏价值总和。
f[i][0]当前树高度为10,且前后的树高度均大于它(这是必然的);
f[i][1]当前树高度为20,且前后的树高度均大于它;
f[i][2]当前树高度为20,且前后的树高度均小于它;
f[i][3]当前树高度为30,且前后树的高度均小于它(这也是必然的)。
接下来以上述四种情况为第一棵树进行四次dp,每一次的f[i]=max(f[n-1][上述情况对应的前一棵树的情况]),绕各树一圈直到返回起始点,如f[i][0]对应的前一棵树就是f[i-1][2]和f[i-1][3]。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 const int MAXN=100000+500; 6 using namespace std; 7 int f[MAXN][4]; 8 /*f[i][0..3]·Ö±ð±íʾǰi¿ÃÊ÷µÄ×î´ó¹ÛÉͼÛÖµ×ÜºÍ 9 f[i][0]µ±Ç°Ê÷¸ß¶ÈΪ10£¬ÇÒÇ°ºóµÄÊ÷¸ß¶È¾ù´óÓÚËü£¨ÕâÊDZØÈ»µÄ£© 10 f[i][1]µ±Ç°Ê÷¸ß¶ÈΪ20£¬ÇÒÇ°ºóµÄÊ÷¸ß¶È¾ù´óÓÚËü 11 f[i][2]µ±Ç°Ê÷¸ß¶ÈΪ20£¬ÇÒÇ°ºóµÄÊ÷¸ß¶È¾ùСÓÚËü 12 f[i][3]µ±Ç°Ê÷¸ß¶ÈΪ30£¬ÇÒÇ°ºóÊ÷µÄ¸ß¶È¾ùСÓÚËü£¨ÕâÒ²ÊDZØÈ»µÄ£©*/ 13 int a[MAXN][3]; 14 /*a[i][j]±íʾµÚi¸öλÖõÚjÖÖÊ÷µÄÉóÃÀ¼ÛÖµ*/ 15 int n,ans; 16 17 void init() 18 { 19 scanf("%d",&n); 20 for (int i=0;i<n;i++) 21 for (int j=0;j<3;j++) scanf("%d",&a[i][j]); 22 } 23 24 void dp(int x) 25 { 26 for (int i=0;i<4;i++) f[0][i]=-0x7fffffff; 27 f[0][x]=a[0][(x+1)/2]; 28 for (int i=1;i<n;i++) 29 { 30 f[i][0]=max(f[i-1][2],f[i-1][3])+a[i][0]; 31 f[i][1]=f[i-1][3]+a[i][1]; 32 f[i][2]=f[i-1][0]+a[i][1]; 33 f[i][3]=max(f[i-1][0],f[i-1][1])+a[i][2]; 34 } 35 } 36 37 38 void mainprocess() 39 { 40 ans=-1; 41 dp(0); 42 ans=max(ans,max(f[n-1][2],f[n-1][3])); 43 dp(1); 44 ans=max(ans,f[n-1][3]); 45 dp(2); 46 ans=max(ans,f[n-1][0]); 47 dp(3); 48 ans=max(ans,max(f[n-1][0],f[n-1][1])); 49 cout<<ans<<endl; 50 } 51 52 int main() 53 { 54 freopen("mr368.in0","r",stdin); 55 freopen("mr368.ou0","w",stdout); 56 init(); 57 mainprocess(); 58 return 0; 59 }
原文:http://www.cnblogs.com/iiyiyi/p/4736254.html