【NOI1995】石子合并
生活随笔
收集整理的這篇文章主要介紹了
【NOI1995】石子合并
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
區(qū)間動態(tài)規(guī)劃的經(jīng)典題,關(guān)于區(qū)間dp,狀態(tài)定義是很顯然的,定義f[i][j]表示把i~j這一區(qū)間合并花費的最小值,若i=j,則f[i][j]=0,若i≠j,則在i,j當中必定有一點k,使得i,j的區(qū)間先合并成i,k和k+1,j,然后合并成i,j.因此,對于每一對i,j,我們都枚舉k,那么f[i][j]=min(f[i][k]+f[k+1][j]).然后我們預(yù)處理出合并的花費,相加即可。
另外,我們在循環(huán)的時候一定要注意階段,狀態(tài),決策三者從外到內(nèi)循環(huán)。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 int sum[310],f[310][310],n; 6 int main() { 7 cin>>n; 8 memset(f,0x3f,sizeof(f)); 9 for(int i=1,x;i<=n;i++) { 10 cin>>x; 11 f[i][i]=0; 12 sum[i]=sum[i-1]+x; 13 } 14 for(int i=2;i<=n;i++) { 15 for(int l=1;l<=n-i+1;l++) { 16 int r=l+i-1; 17 for(int k=l;k<r;k++) 18 f[l][r]=min(f[l][r],f[l][k]+f[k+1][r]); 19 f[l][r]+=sum[r]-sum[l-1]; 20 } 21 } 22 cout<<f[1][n]<<endl; 23 return 0; 24 } AC Code?
轉(zhuǎn)載于:https://www.cnblogs.com/shl-blog/p/10664295.html
總結(jié)
以上是生活随笔為你收集整理的【NOI1995】石子合并的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 意外险最多可以买几份 最好咨询不同的保
- 下一篇: 光大信用卡可以推迟一天还款吗