1. 程式人生 > >洛谷P1133 教主的花園 動態規劃

洛谷P1133 教主的花園 動態規劃

ans read 如果 printf class 但是 lin name size

洛谷P1133 教主的花園
動態規劃

這裏是環狀的,但是我們並不用將他破環成鏈
只要枚舉第一個點 根據第一個點選擇最後一個選擇什麽就行了
然後我們進行DP
註意如果當前是 2 的話要分情況 上一次是上升 1 還是下降 0

F1[ i ] 表示 第 i 位置的種第 1 種樹所能獲得的最大價值
F2[ i ][ 0 ] 表示 第 i 位置的 種第 2 種樹 且上次是下降

 1 #include <bits/stdc++.h> 
 2 #define For(i,j,k) for(int i=j;i<=k;i++) 
 3 using namespace std ; 
4 5 const int N = 100011 ; 6 int n,ans ; 7 int F1[N],F2[N][2],F3[N],num[N][4] ; 8 9 inline int read() 10 { 11 int x = 0 , f = 1 ; 12 char ch = getchar() ; 13 while(ch<0||ch>9) { if(ch==-) f = -1 ; ch = getchar(); } 14 while(ch>=0&&ch<=9) { x = x * 10
+ch-48 ; ch = getchar(); } 15 return x * f ; 16 } 17 18 inline void calc() 19 { 20 For(i,2,n) { 21 if( F2[i-1][1] ) F1[i] = max( F1[i],F2[i-1][1]+num[i][1] ) ; 22 if( F3[i-1] ) F1[i] = max( F1[i],F3[i-1]+num[i][1] ) ; 23 if( F2[i-1][0] ) F3[i] = max( F3[i],F2[i-1
][0]+num[i][3]) ; 24 if( F1[i-1] ) F3[i] = max( F3[i],F1[i-1]+num[i][3] ) ; 25 if( F1[i-1] ) F2[i][1] = F1[i-1] + num[i][2] ; 26 if( F3[i-1] ) F2[i][0] = F3[i-1] + num[i][2]; 27 } 28 } 29 30 int main() 31 { 32 n = read() ; 33 For(i,1,n) 34 num[i][1] = read() ,num[i][2] = read() ,num[i][3] = read() ; 35 For(k,1,4) { 36 memset(F1,0,sizeof F1) ; 37 memset(F2,0,sizeof F2) ; 38 memset(F3,0,sizeof F3) ; 39 if(k==1) F1[ 1 ] = num[ 1 ][ 1 ] ; 40 if(k==2) F2[ 1 ][0] = num[ 1 ][ 2 ] ; 41 if(k==3) F2[ 1 ][1] = num[ 1 ][ 2 ] ; 42 if(k==4) F3[ 1 ] = num[ 1 ][ 3 ] ; 43 calc() ; 44 if(k==1) ans = max(ans,F3[n]), ans = max(ans,F2[n][1]) ; 45 if(k==2) ans = max(ans,F3[n]) ; 46 if(k==3) ans = max(ans,F1[n]) ; 47 if(k==4) ans = max(ans,F1[n]), ans = max(ans,F2[n][0]) ; 48 } 49 printf("%d\n",ans) ; 50 return 0 ; 51 }

洛谷P1133 教主的花園 動態規劃