zoukankan      html  css  js  c++  java
  • HDOJ2571 命运[DP]

    命运

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 4701    Accepted Submission(s): 1675


    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
    52
     
    Author
    yifenfei
     
    Source
     
    Recommend
    yifenfei
     
     
     
     
     
     
    code:
     1 #include<iostream>
     2 using namespace std;
     3 
     4 int dp[21][1010];
     5 int n,m;
     6 
     7 int main()
     8 {
     9     int t;
    10     int i,j,k;
    11     scanf("%d",&t);
    12     while(t--)
    13     {
    14         memset(dp,0,sizeof(dp));
    15         scanf("%d%d",&n,&m);
    16         for(i=1;i<=n;i++)
    17             for(j=1;j<=m;j++)
    18                 scanf("%d",&dp[i][j]);
    19         for(i=1;i<=n;i++)
    20             dp[i][1]+=dp[i-1][1];
    21         for(i=1;i<=n;i++)
    22             for(j=2;j<=m;j++)
    23             {
    24                 int temp;
    25                 if(i==1)
    26                     temp=dp[i][j-1];
    27                 else if(j==1)
    28                     temp=dp[i-1][j];
    29                 else
    30                     temp=max(dp[i-1][j],dp[i][j-1]);
    31                 for(k=1;k<j;k++)
    32                 {
    33                     if(j%k==0)
    34                         temp=max(temp,dp[i][k]);
    35                 }
    36                 dp[i][j]+=temp;
    37             }
    38         printf("%d\n",dp[n][m]);
    39     }
    40     return 0;
    41 }
    42 /*
    43 5
    44 3 3
    45 1 2 3
    46 4 5 3
    47 1 8 1
    48 */
  • 相关阅读:
    UVA 10462 Is There A Second Way Left?(次小生成树&Prim&Kruskal)题解
    POJ 1679 The Unique MST (次小生成树)题解
    POJ 2373 Dividing the Path (单调队列优化DP)题解
    BZOJ 2709 迷宫花园
    BZOJ 1270 雷涛的小猫
    BZOJ 2834 回家的路
    BZOJ 2506 calc
    BZOJ 3124 直径
    BZOJ 4416 阶乘字符串
    BZOJ 3930 选数
  • 原文地址:https://www.cnblogs.com/XBWer/p/2652676.html
Copyright © 2011-2022 走看看