標籤:style blog color io ar for 資料 sp div
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 int n,ans,v[41],c[41],s[2]; 5 int work(int L,int R)//分治 6 { 7 if(L==R) return v[L]; 8 int res=0; 9 for(int i=L;i<R;i++)10 if(c[i]==‘+‘) res=max(res,work(L,i)+work(i+1,R));11 else if(c[i]==‘*‘) res=max(res,work(L,i)*work(i+1,R));12 return res;13 }14 int main()15 {16 scanf("%d",&n);17 for(int i=1;i<=n;i++)//把環展開成n條鏈 18 {19 scanf("%d%s",&v[i],s);20 v[n+i]=v[i];21 c[i]=c[n+i]=s[0];22 }23 for(int i=1;i<=n;i++)24 ans=max(ans,work(i,i+n-1));25 printf("%d\n",ans);26 return 0;27 }
-
總時間限制:
-
1000ms
記憶體限制: 65536kB
-
描述
-
一個多邊形,開始有n個頂點。每個頂點被賦予一個正整數值,每條邊被賦予一個運算子“+”或“*”。所有邊依次用整數從1到n編號。 現在來玩一個遊戲,該遊戲共有n步: 第1步,選擇一條邊,將其刪除 隨後n-1步,每一步都按以下方式操作:(1)選擇一條邊E以及由E串連著的2個頂點v1和v2; (2)用一個新的頂點取代邊E以及由E串連著的2個頂點v1和v2,將頂點v1和v2的整數值通過邊E上的運算得到的結果值賦給新頂點。
最後,所有邊都被刪除,只剩一個頂點,遊戲結束。遊戲得分就是所剩頂點上的整數值。那麼這個整數值最大為多少?
-
輸入
-
第一行為多邊形的頂點數n(n ≤ 20),其後有n行,每行為一個整數和一個字元,整數為頂點上的正整數值,字元為該頂點到下一個頂點間連邊上的運算子“+”或“*”(最後一個字元為最後一個頂點到第一個頂點間連邊上的運算子)。
-
輸出
-
輸出僅一個整數,即遊戲所計算出的最大值。
-
範例輸入
-
44 *5 +5 +3 +
-
範例輸出
-
70
-
提示
-
小規模問題可不必用動態規劃方法編程求解,僅用遞迴就可以求解。 計算中不必考慮計算結果超出整數表達範圍的問題,給出的資料能保證計算結果的有效性。 在給的例子中,計算過程為(3+4)*(5+5)=70。
ORZ szy
分治思想,首先把環展成n條鏈,在處理的時候遞迴分治處理。
【分治】計算概論(A) / 函數遞迴練習(1)多邊形遊戲