No older revisions available
No older revisions available
소감 ¶
2005-12-28 Accepted 0.785 452 |
코드 ¶
~cpp
// 10003 - Cutting Sticks
#include <iostream>
using namespace std;
//#include <fstream>
#define MAX_CUT 53
#define MAX_NUM 0x7fffffff
//fstream fin("in.txt");
static int lenStick, numCut;
static int cut[MAX_CUT];
static int d[MAX_CUT][MAX_CUT];
bool input()
{
cin >> lenStick;
if (lenStick == 0)
return false;
cin >> numCut;
for (int i = 1; i <= numCut; i++)
cin >> cut[i];
return true;
}
void initTable()
{
cut[0] = 0, cut[numCut+1] = lenStick;
for (int i = 0; i <= numCut; i++)
d[i][i+1] = cut[i+1] - cut[i];
}
int process()
{
initTable();
int j, min;
for (int step = 1; step <= numCut; step++)
{
for (int i = 0; i <= numCut - step; i++)
{
j = i + step + 1;
min = MAX_NUM;
for (int k = i + 1; k <= j - 1; k++)
{
if (min > d[i][k] + d[k][j])
min = d[i][k] + d[k][j];
}
d[i][j] = min + cut[j] - cut[i];
}
}
return d[0][numCut+1] - lenStick;
}
inline
void show(const int result)
{
cout << "The minimum cutting is " << result << ".\n";
}
int main()
{
int result;
while (input())
{
result = process();
show(result);
}
return 0;
}