概述:给出一块地图数据,需要从最左上角走到最右下角,每走一步所在的地方都有数据,求怎么走才有最大的数据。
思路:DP的问题,需要考虑的是相加会出现负数。
感想:自己做了一遍,最后自己在编译器上结果始终出不来,然后再别人博客看到才发现没有考虑负数的问题。。。然后按照那个思路再来一遍,过。
#include<iostream>
#include<algorithm>
#include<fstream>
#include<cmath>
#include<string.h>
using namespace std;
int map[25][1005];
int dp[25][1005];
int max(int a, int b)
{
if (a > b)
return a;
else return b;
}
int main()
{
//ifstream cin("in.txt");
int C;
cin >> C;
while (C--)
{
int x, y;
cin >> x >> y;
for (int i = 1;i <= x;i++)
for (int j = 1;j <= y;j++)
cin >> map[i][j];
for (int i = 0;i <= x;i++)
dp[i][0] = -99999999;
for (int j = 0;j <= y;j++)
dp[0][j] = -99999999;
dp[0][1] = dp[1][0] = 0;
for (int i = 1;i <= x;i++)
for (int j = 1;j <= y;j++)
{
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
for (int k = 2; k <= y; k++)
{
if (j / k == (double)j / k)
dp[i][j] = max(dp[i][j], dp[i][j / k]);
}
dp[i][j] += map[i][j];
}
cout << dp[x][y] << endl;
}
return 0;
}