修理ブルペン(貪欲/ダイナミックプログラミング)
問題の説明:
ブルペンの嵐の夜、ファーマージョンの屋根では、ドアが吹き飛ばされました。住んでいない:ブルペン(1 <= S <= 200 Sの牛舎合計数が)ので、幸いなことに、多くの牛が、休暇です。残りの牛は他の夜のブルペン並ぶ屋根に設置した目白押し。牛牛のいくつかのように、いくつかはしないでください。すべての牛舎同じ幅を持っている、と幅が1に設定されています。いくつかのドアが欠落しているので、ファーマージョンはドアとして新しいボードを設定する必要があります。彼の新しい木材供給業者は彼に彼が望んでいる任意の長さを供給しますが、唯一の木材の供給業者の限られた数を提供することができます。ファーマージョンは全体の長さを最小限にするために彼の木材を購入したいです。
最小の長さの合計を計算する牛の納屋のすべてのボードを停止するために必要。
所望の回答として出力ボードの最小全長。
説明:ボードは、牛のために必要な長さを停止し、牛は、3つの隣接する厚板3の長さを必要と停止。
たとえば、牛は牛舎多数あります。
3 5 8 10 11
そして唯一の、木材の二枚を使用することができます
3から5まで木材の最初のピース、3の長さは、
8から11への第2厚板、4の長さ、
従って、全長は基板7のために必要。
説明を入力します。
行1:MとC(スペースで区切られました)
二行目のC + 1:各行は納屋が占有牛の数を示す整数を含んでいます。
どこで:
利用可能な木材の最大可能数:M(1 <= M <= 50)。
ウシ(1 <= C <= S)必要な数Cを配置しました
牛舎ここ牛番号stall_number(1 <= stall_number <= S)を配置した後。
出力説明:
これは、厚板のに必要な最小全長整数単一ラインを含みます
入力例:
3 5 2 4 6 8 7
出力例:
5
動的なプログラミング手法:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int n, m;
int num[201];
int dp[51][201];
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; i++)
{
scanf("%d", &num[i]);
}
sort(num+1, num + m+1);
memset(dp, 127, sizeof(dp));
dp[0][0] = 0;
num[0] = 0;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
dp[i][j] = min(dp[i][j - 1] + num[j]-num[j-1], dp[i - 1][j - 1] + 1);
}
}
int minx = 100000;
for (int i = 1; i <= n; i++)
{
minx = min(minx, dp[i][m]);
}
printf("%d\n", minx);
return 0;
}