【分治】計算概論(A) / 函數遞迴練習(1)多邊形遊戲

來源:互聯網
上載者:User

標籤: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)多邊形遊戲

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.