1021 石子歸併
基準時間限制:1 秒 空間限制:131072 kb 分值: 20
難度:3級演算法題
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(14) => 10(24)
1 2 3 4 => 1 2 7(7) => 3 7(10) => 10(20)
括號裡面為總代價可以看出,第一種方法的代價最低,現在給出n堆石子的數量,計算最小合併代價。
input
第1行:n(2 <= n <= 100)output第2 - n + 1:n堆石子的數量(1 <= a[i] <= 10000)
輸出最小合併代價input示例
412output示例34
19知道了四邊形優化後就是水題了。不過因為是環,所以要特殊處理一下。環的情況即以陣列任意乙個元素為開頭列舉即可。但這樣會t(n^3)故我們將長度為n的陣列變成長度為2 * n的陣列,每次處理時最多處理n個連續元素,複雜度較直線石子合併只多了常數乘項(4)
ac**
#include #include #include #include #include #include #include #include #include typedef long long ll;
using namespace std;
const ll maxn = 2e3 + 5, inf = 1e18 + 10;
ll sum[maxn], dp[maxn][maxn], s[maxn][maxn];
void init()
}int main()
for(ll i = 1; i <= n; i++)
sum[i + n] = sum[n] + sum[i];
for(ll i = 2 * n; i >= 1; i--)
}} }
ll ans = dp[1][n];
for(ll i = 2; i <= n; i++)
ans = min(ans, dp[i][i + n - 1]);
printf("%lld\n", ans);
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,有不少...
51nod1021石子歸併(區間dp)
include include include using namespace std int n int a 105 sum 105 int dp 105 105 const int inf 0x3f3f3f3f void init int main for int len 2 len n len...