又是一题经典的DP,很多小细节要注意,不然就WA了
#include <vector>
#include <string>
#include <string.h>
#include <stdio.h>
using namespace std;
int main()
{
int width = 0;
while (scanf("%d", &width) && width > 0)
{
getchar();
vector<string> words;
char str[10000] = "";
while (1)
{
gets(str);
if (strlen(str) == 0)
{
break;
}
char *p = strtok(str, " ");
while (p != NULL)
{
words.push_back(string(p));
p = strtok(NULL, " ");
}
}
int nWordCnt = words.size();
int *pBadness = new int[nWordCnt];
int *pEndWordIndex = new int[nWordCnt];
int *pBadSpaceSum = new int[nWordCnt];
if (pBadness)
{
for (int i = nWordCnt - 1; i >= 0; i--)
{
pBadness[i] = 500;
if (i + 1 < nWordCnt)
{
pBadness[i] += pBadness[i + 1];
}
pEndWordIndex[i] = i;
pBadSpaceSum[i] = 0;
int nWordLenSum = words[i].length();
for (int j = i + 1; j < nWordCnt; j++)
{
int nGapCnt = j - i;
nWordLenSum += words[j].length();
if (nWordLenSum + nGapCnt > width)
{
break;
}
int nBadSpaceSum = width - nWordLenSum - nGapCnt;
// let n * x + k = sum, or (n - k) * x + k * (x + 1) = sum
// then badness = n * (x ^ 2) + 2 * k * (x + 1)
int k = nBadSpaceSum % nGapCnt;
int nBadness = nGapCnt * (nBadSpaceSum / nGapCnt) * (nBadSpaceSum / nGapCnt)
+ 2 * k * (nBadSpaceSum / nGapCnt + 1);
if (j + 1 < nWordCnt)
{
nBadness += pBadness[j + 1];
}
if (nBadness <= pBadness[i])
{
pBadness[i] = nBadness;
pEndWordIndex[i] = j;
pBadSpaceSum[i] = nBadSpaceSum;
}
}
}
int begin = 0;
while (begin < nWordCnt)
{
int end = pEndWordIndex[begin];
int nGapCnt = end - begin;
int k = 0;
if (nGapCnt > 0)
{
k = pBadSpaceSum[begin] % nGapCnt;
}
for (int i = begin; i <= end; i++)
{
if (i > begin)
{
printf("%*c", pBadSpaceSum[begin] / nGapCnt, ' ');
if (i > end - k)
{
printf(" ");
}
}
printf("%s", words[i].c_str());
}
printf("\n");
begin = pEndWordIndex[begin] + 1;
}
printf("\n");
}
}
return 0;
}