假設有n堆石子,要把石子有次序的兩兩合併,要求代價最小。假設1~n之間有一k,把石子分為1~k和k~n兩部分,劃分後的這兩部分再繼續這樣劃分,直到不能劃分,然後就開始分別合併,求出合併後的最小代價,即cost[1~n]=min,用記憶化搜尋還是比較好寫的。
#include
#include
#include
using
namespace
std;
const
int inf = 0x3f3f3f3f;
const
int maxn = 110;
int num[maxn];
int sum[maxn];
int n;
int dp[maxn][maxn];
int dfs(int l, int r)
int main()
int res = dfs(1,n);
printf("%d\n",res);
return
0;}
用迴圈寫:
#include
#include
#include
using
namespace
std;
const
int inf = 0x3f3f3f3f;
const
int maxn = 110;
int dp[maxn][maxn];
int num[maxn],sum[maxn];
int n;
int main()
for(int l = 2; l <= n; ++l)
}cout
<< dp[1][n] << endl;
return
0;}
51nod 1021 石子歸併
n堆石子擺成一條線。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的代價。計算將n堆石子合併成一堆的最小代價。例如 1 2 3 4,有不少合併方法 1 2 3 4 3 3 4 3 6 4 9 10 19 1 2 3 4 1 5 4 5 1 9...
51nod 1021 石子歸併
1021 石子歸併 基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 n堆石子擺成一條線。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的代價。計算將n堆石子合併成一堆的最小代價。例如 1 2 3 4,有不少...
51nod 1021 石子歸併
1021 石子歸併 基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 n堆石子擺成一條線。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的代價。計算將n堆石子合併成一堆的最小代價。例如 1 2 3 4,有不少...