ACM-HDU2571 命運

Problem Descriptionios

穿過幽谷意味着離大魔王lemon已經無限接近了!可誰能想到,yifenfei在斬殺了一些蝦兵蟹將後,卻再次面臨命運大迷宮的考驗,這是魔王lemon設下的又一個機關。要知道,不論何人,若在迷宮中被困1小時以上,則必死無疑!可憐的yifenfei爲了去救MM,義無返顧地跳進了迷宮。讓咱們一塊兒幫幫執着的他吧!命運大迷宮能夠當作是一個兩維的方格陣列,以下圖所示:
 
yifenfei一開始在左上角,目的固然是到達右下角的大魔王所在地。迷宮的每個格子都受到幸運女神眷戀或者痛苦魔王的詛咒,因此每一個格子都對應一個值,走到那裏便自動獲得了對應的值。
如今規定yifenfei只能向右或者向下走,向下一次只能走一格。可是若是向右走,則每次能夠走一格或者走到該行的列數是當前所在列數倍數的格子,即:若是當前格子是(x,y),下一步能夠是(x+1,y),(x,y+1)或者(x,y*k) 其中k>1。 
爲了可以最大把握的消滅魔王lemon,yifenfei但願可以在這個命運大迷宮中獲得最大的幸運值。

 
Input
輸入數據首先是一個整數C,表示測試數據的組數。
每組測試數據的第一行是兩個整數n,m,分別表示行數和列數(1<=n<=20,10<=m<=1000);
接着是n行數據,每行包含m個整數,表示n行m列的格子對應的幸運值K ( |k|<100 )。
 
Output
請對應每組測試數據輸出一個整數,表示yifenfei能夠獲得的最大幸運值。
 
Sample Input
1
3 8
9 10 10 10 10 -10 10 10
10 -11 -1 0 2 11 10 -20
-11 -11 10 11 2 10 -10 -10
 
Sample Output
52
 
分析:DP求解(求從左上角走到右下角的最大值),遞推公式爲:dp[i][j] = max(dp[i-1][j],dp[i][j-1],dp[i][k]) + data[i][j]。其中dp[i][j]表示男主角到達第i行第j列所能達到的幸運值的最大值。data[i][j]表示第i行第j列的幸運值。其中 k爲j的真因子。(找真因子,包括1,即找除自己之外的其餘約數,由於題目存在 "每次能夠走一格或者走到該行的列數是當前所在列數倍數的格子" 這樣的條件)
 
 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 using namespace std;
 5 
 6 const int maxn = 21;
 7 const int maxm = 1000;
 8 const int inf = -101;
 9 
10 int dp[maxn][maxn];
11 int data[maxm][maxm];
12 
13 int n,m;
14 
15 void calc()
16 {
17     int i,j,k;
18 
19     dp[0][1] = 0;
20     dp[1][0] = 0;
21 
22     for(i = 1;i <= n;++i)
23     {
24         for(j = 1;j <= m;++j)
25         {
26             int temp = inf;
27             for(k = 1;k < j;++k)
28             {
29                 if(j % k == 0)
30                     temp = max(temp,dp[i][k]);
31             }
32             temp = max(temp,dp[i-1][j]);
33             temp = max(temp,dp[i][j-1]);
34 
35             dp[i][j] = data[i][j] + temp;
36         }
37     }
38 }
39 int main()
40 {
41     int N;
42     int i,j;
43     while(cin >> N)
44     {
45         memset(dp,0,sizeof(dp));
46         cin >>n>>m;
47         for(i = 1;i <= n;++i)
48         {
49             for(j = 1;j <= m;++j)
50             {
51                 cin>>data[i][j];
52             }
53         }
54         calc();
55         cout<<dp[n][m]<<endl;
56     }
57 }
View Code
相關文章
相關標籤/搜索