生活随笔
收集整理的這篇文章主要介紹了
算法设计与分析——动态规划——石子合并问题
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1.石子合并問題
在一個圓形操場的四周擺放著n堆石子。現(xiàn)要將石子有序地合并成一堆。規(guī)定每次只能選相鄰的2堆石子合并成新的一堆,并將新的一堆石子數(shù)記為該次合并的得分。設(shè)計(jì)一個算法,計(jì)算出將n堆石子合并成一堆的最小得分和最大得分。
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std
;
#define Ma_x 99999
#define Mi_x 0
#define min(a,b) a<b?a:b
#define max(a,b) a>b?a:b int n
,w
[200],dp
[200][200],dq
[200][200];
int sum(int i
,int t
){int k
,s
=0,k1
;for(k
=i
;k
<i
+t
;k
++){k1
=k
%n
;if(k1
==0) k1
=n
;s
=s
+w
[k1
]; }return s
;
}void stone_problem()
{for(int t
=2;t
<=n
;t
++){for(int i
=1;i
<=n
;i
++){dp
[i
][t
]=Ma_x
;dq
[i
][t
]=Mi_x
; for(int k
=1;k
<t
;k
++){dp
[i
][t
]=min(dp
[i
][t
],dp
[i
][k
]+dp
[(i
+k
-1)%n
+1][t
-k
]+sum(i
,t
));dq
[i
][t
]=max(dq
[i
][t
],dq
[i
][k
]+dq
[(i
+k
-1)%n
+1][t
-k
]+sum(i
,t
));}}}int mini
=Ma_x
;int maxi
=Mi_x
; for(int i
=1;i
<=n
;i
++){mini
=min(mini
,dp
[i
][n
]); maxi
=max(maxi
,dq
[i
][n
]); }cout
<<"輸出合并成一堆的最小花費(fèi)為:"<<mini
<<endl
;cout
<<"輸出合并成一堆的最小花費(fèi)為:"<<maxi
<<endl
;}
int main(){cout
<<"輸入石子的堆數(shù)";cin
>>n
;for(int i
=1;i
<=n
;i
++){cin
>>w
[i
];dp
[i
][1]=0;dq
[i
][1]=0; }stone_problem();
}
總結(jié)
以上是生活随笔為你收集整理的算法设计与分析——动态规划——石子合并问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。