这个题目就是花瓶插花的问题,不知道是题目太水了还是自己的思路很清晰,二十分钟,一次AC。
感觉不错~
//#define LOCAL
#include <stdio.h>
#include <string.h>
#define MAXN 100 + 10
int values[MAXN][MAXN];
int ans[MAXN][MAXN];
int numberOfFlowers;
int numberOfVases;
int i,j;
void dp();
int main()
{
#ifdef LOCAL
freopen("C:\\Users\\Administrator\\Desktop\\Temp\\ACMTempIn.txt", "r", stdin);
//freopen("C:\\Users\\Administrator\\Desktop\\Temp\\ACMTempOut.txt", "w", stdout);
#endif
while(scanf("%d%d", &numberOfFlowers, &numberOfVases) != EOF)
{
// 数据输入
for(i = 1; i <= numberOfFlowers; i++)
{
for(j = 1; j <= numberOfVases; j++)
{
scanf("%d", &values[i][j]);
}
}
// 算法主体
dp();
// 输出结果
printf("%d\n", ans[numberOfFlowers][numberOfVases]);
}
return 0;
}
void dp()
{
memset(ans, 0, sizeof(ans));
ans[1][1] = values[1][1];
for(i = 2; i <= numberOfVases; i++)
{
if(values[1][i] > ans[1][i - 1])
ans[1][i] = values[1][i];
else
ans[1][i] = values[1][i - 1];
}
for(i = 2; i <= numberOfFlowers; i++)
{
ans[i][i] = ans[i - 1][i - 1] + values[i][i];
for(j = i + 1; j <= numberOfVases; j++)
{
if(ans[i - 1][j - 1] + values[i][j] > ans[i][j - 1])
{
ans[i][j] = ans[i - 1][j - 1] + values[i][j];
}
else
{
ans[i][j] = ans[i][j - 1];
}
}
}
}