zoukankan      html  css  js  c++  java
  • [HDU] 2571命运 最基本的入门dp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2571

    方法:建立状态转移方程,设F(x,y)为当前走到获得的最大幸运值,current(x,y)为当前位置本来就具有的幸运值,则方程为:

        {

          0,  x<1 or y<1;

    F(x,y) =  Max(  {F(x-1,y)+current(x,y)} U { F(x,yi)+current(x,y) | (yi%y==0 and yi!=y) or yi+1==y }  );  

          current(1,1),  x==1 and y==1;

        }

    在自底向上的时候,需要考虑一个位子列数c的小于c的真因子,注意找因子的方法是首先对c开根号,然后在从开根后的结果一个一个向1枚举,找到一个能整出c的数a后就自然找到另外一个能整除c的数c/a. 1作为c的平凡因子,这里只考虑1这个平凡因子的位子,不考虑c/1=c这个平凡因子的位子。

    感谢:基本dp,入门练习专用。

    代码:

    View Code
    #include<iostream>
    #include<math.h>
    using namespace std;
    int const MAX =0x3f3f3f3f;
     
    int matrix[21][1001];
    int dp[21][1001];
    int n,m;
    int main()
    {
        int tc=0,t;
        scanf("%d",&t);
        while(tc<t)
        {
            memset(matrix,0,sizeof(matrix));
            memset(dp,-MAX,sizeof(dp));
            scanf("%d %d",&n,&m);
            for(int i =1;i<=n;i++)
                for(int j=1;j<=m;j++)
                {
                    scanf("%d",&matrix[i][j]);
                }
            dp[1][1] = matrix[1][1];
            for(int i=2;i<=n;i++)
                dp[i][1] = dp[i-1][1]+matrix[i][1]; 
            for(int x= 1; x<=n;x++)
            {
                for(int i =2;i<=m;i++)
                {
                     if(matrix[x][i]+dp[x][i-1]>dp[x][i])
                        dp[x][i] = matrix[x][i]+dp[x][i-1];
                      if(matrix[x][i]+dp[x][1]>dp[x][i])
                        dp[x][i] = matrix[x][i]+dp[x][1];
                      int boundary =(int)sqrt(i+0.0); 
                      for(int k = 2; k<=boundary;k++)
                      {
                          if(i%k==0)
                          {
                             if(matrix[x][i]+dp[x][k]>dp[x][i])
                                dp[x][i] = matrix[x][i]+dp[x][k];
                             if(matrix[x][i]+dp[x][i/k]>dp[x][i])
                                dp[x][i] = matrix[x][i]+dp[x][i/k];
                          }
                      }
    
                      if(x>1)
                      {
                          if(matrix[x][i]+dp[x-1][i]>dp[x][i])
                            dp[x][i] = matrix[x][i]+dp[x-1][i];
                      }
                }
            }
            cout<<dp[n][m]<<endl;
            tc++;
        }
     
        return 0;
    } 
  • 相关阅读:
    js中$
    js中 javascript:void(0) 用法详解
    Git关于pull,commit,push的总结
    k8s记录-docker-compose脚本参考
    k8s记录-docker部署mysql和nginx
    Linux记录-ssh批量双向无密码登录
    Linux记录-ssh无密码执行脚本
    Linux记录-一些常用操作
    k8s记录-Dockerfile详解
    k8s记录-kubectl常用命令
  • 原文地址:https://www.cnblogs.com/kbyd/p/3035410.html
Copyright © 2011-2022 走看看