zoukankan      html  css  js  c++  java
  • [HDU]2571命运

    http://acm.hdu.edu.cn/showproblem.php?pid=2571

    这又是一题升级版的数塔.

    如果当前格子是(x,y),下一步可以是(x+1,y),(x,y+1)或者(x,y*k) 其中k>1,这句话是什么意思呢?

    举个例子从(1,1)到(1,4)可以按最规范的走法(1,1)(1,2)(1,3)(1,4);也可以(1,1)(1,2)(1,4);还可以(1,1)(1,4)

    这样的话,计算每个位置的最大值时,还要依次与该行步数y的分子比较;

    还有一个问题就是边界问题,(1,1)是很明显的边界,所以我避开了它.

    把这个二维方格矩阵分成了3部分,1是第一行,2是第一列,3是其余的各个部分

    #include"stdio.h"
    #include"stdlib.h"
    int dp[25][1010];                                       //保存每个位置的最大值 
    int maxabc(int a,int b)
    {
        int max;
        max=a>b?a:b;
        return max;
    }
    int main()
    {
          int t,n,m,i,j,k,max,temp1,temp2,temp3;
          scanf("%d",&t);
          while(t--)
          {
                 scanf("%d%d",&n,&m); 
                 for(i=1;i<=n;i++)                              //初始化,不过应该不用初始也没关系,因为接下来已经全部赋值            
                  for(j=1;j<=m;j++)
                  dp[i][j]=0;
                 for(i=1;i<=n;i++)
                  for(j=1;j<=m;j++)
                   scanf("%d",&dp[i][j]);
                 for(j=2;j<=m;j++)                              //第一行的处理(不包括第一行第一个) 
                 {
                         max=dp[1][j-1];
                         for(k=1;k<j;k++)                          
                         {
                              if(j%k==0)
                              {
                                 temp1=dp[1][k];                    //友情提示:1不要打成i,要不找半天都找不出哪错了,,,, 
                                 max=maxabc(max,temp1);
                              }
                         }                    
                         dp[1][j]+=max;
                 } 
                 for(i=2;i<=n;i++)                             //第一列的处理(不包括第一行第一个) 
                 dp[i][1]+=dp[i-1][1];
                 for(i=2;i<=n;i++)
                  for(j=2;j<=m;j++)                            //剩余情况的处理 
                 {
                       temp1=dp[i][j-1];
                       temp2=dp[i-1][j];
                       max=maxabc(temp1,temp2);
                       for(k=1;k<j;k++)
                       {
                           if(j%k==0)
                           {
                              temp3=dp[i][k];
                              max=maxabc(max,temp3);
                           }
                       }
                       dp[i][j]+=max;
                 }
                 printf("%d
    ",dp[n][m]);
          }
         // system("pause");
    } 
  • 相关阅读:
    使用element-ui table expand展开行实现手风琴效果
    使用js生成二维码和条形码
    js时间戳转换时间、距当前时间
    使用js在浏览器中禁止右键、审查元素、复制功能
    VS Code编辑器插件整理及配置设定
    在vue项目中使用canvas-nest.js,报parameter 1 is not of type 'Element'
    JS中的函数
    Babel 7 初探
    package-lock.json 文件
    Js 中的数组
  • 原文地址:https://www.cnblogs.com/sjy123/p/3243508.html
Copyright © 2011-2022 走看看