Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 998 Accepted Submission(s): 336
Problem Description
穿过幽谷意味着离大魔王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
Author
yifenfei
Source
Recommend
yifenfei
Statistic |
Submit |
Discuss | Back
DP
1#include<iostream>
2#include<algorithm>
3using namespace std;
4const int inf=~0U>>1;//取向无穷
5int n,m;
6int a[21][1001];
7int data[21][1001];//记录每一个点的最大幸运值
8
9int max(int a,int b)
10{
11 return (a>b?a:b);
12}
13
14void dp()
15{
16 int i,j,u,k;
17 //从一个点可以到达哪些点开始从上到下的遍历
18 for(i=1;i<=n;i++)//寻找每一个点
19 for(j=1;j<=m;j++)
20 {
21 //有两种情况:一个是直接一步向下,还有一个是横向y*k<m
22 for(u=0;u<=1;u++)//u代表的是横向走几步,0还是1
23 {
24 if((u==1)&&(i+u>=1)&&(i+u<=n))//直接向下走一步,而且不超出范围
25 {
26 data[i+u][j]=max(data[i+u][j],data[i][j]+a[i+u][j]);
27 }
28 else//向右前进
29 {
30 if(j+1>=1&&j+1<=m)//在范围以内
31 {
32 data[i][j+1]=max(data[i][j+1],data[i][j]+a[i][j+1]);
33 }
34 for(k=2;k*j<=m;k++) //当u=0的时候k代表的是倍数
35 {
36 if(k*j>=1&&j*k<=m)//不超出范围
37 {
38 data[i][j*k]=max(data[i][j*k],data[i][j]+a[i][j*k]);
39 }
40 }
41 }
42 }
43 }
44 cout<<data[n][m]<<endl;
45
46}
47int main()
48{
49 int c,i,j,k;
50 while(cin>>c)
51 {
52 for(i=1;i<=c;i++)
53 {
54 cin>>n>>m;
55
56 memset(a,0,sizeof(a));//初始化
57 memset(data,0,sizeof(data));
58
59 for(j=1;j<=n;j++)//输入处理
60 for(k=1;k<=m;k++)
61 {
62 cin>>a[j][k];
63 data[j][k]=-inf;//对data数据的再次赋值
64 }
65 data[1][1]=a[1][1];
66
67 dp();
68 }
69 }
70 return 0;
71}