HDU 2571 命运

这道DP基本类似数塔,可以从上到下分析,从下到上计算。考虑清楚每种状态时的决策,处理好边界,就可以AC。

数据规模不大,考虑到每个空的值的绝对值小于100,于是输入前先把每个空置为负无穷。留下最右下角数的右边、下边为0。

代码:

 1 #include <iostream>
2 using namespace std;
3
4 const int INF = 1 << 29;
5 int map[25][1005];
6
7 void clear()
8 {
9 for(int i = 0; i < 25; i++)
10 for(int j = 0; j < 1005; j++)
11 map[i][j] = -INF;
12 }
13
14 int main()
15 {
16 int t, n, m;
17 cin >> t;
18 while (t--)
19 {
20 cin >> n >> m;
21 clear();
22
23 for(int i = 1; i <= n; i++)
24 for(int j = 1; j <= m; j++)
25 cin >> map[i][j];
26 map[n][m+1] = map[n+1][m] = 0;
27
28 for(int i = n; i >= 1; i--)
29 {
30 for(int j = m; j >= 1; j--)
31 {
32 int num = max(map[i+1][j], map[i][j+1]);
33 for(int k = 2; j * k <= m; k++)
34 {
35 if(map[i][j*k] > num)
36 num = map[i][j*k];
37 }
38 map[i][j] += num;
39 }
40 }
41 cout << map[1][1] << endl;
42 }
43 return 0;
44 }

 

posted @ 2012-03-20 20:31  dgsrz  阅读(130)  评论(0编辑  收藏  举报