zoukankan      html  css  js  c++  java
  • light oj 1071 dp(吃金币升级版)

     1 #include <iostream>
     2 #include <algorithm>
     3 #include <cstring>
     4 #include <cstdio>
     5 #include <queue>
     6 #define ll long long
     7 
     8 using namespace std;
     9 const int N = 1e5+1000;
    10 
    11 int dp[105*2][105][105];
    12 int maze[105][105];
    13 
    14 
    15 int dfs(int sum,int a,int b)
    16 {
    17     if(dp[sum][a][b] != -1)
    18         return dp[sum][a][b];
    19     if(sum == 0 && a == 0 && b == 0)
    20         return dp[sum][a][b] = maze[0][0];
    21     dp[sum][a][b] = 0;
    22     if(a == b)
    23     {
    24         if(sum - 1 >= 0)
    25         dp[sum][a][b] = max(dp[sum][a][b],dfs(sum-1,a,b) + maze[a][sum-a]);
    26         if(sum - 1 >= 0 && a - 1 >= 0)
    27         dp[sum][a][b] = max(dp[sum][a][b],dfs(sum-1,a-1,b)+ maze[a][sum-a]);
    28         if(sum - 1 >= 0 && b - 1 >= 0)
    29         dp[sum][a][b] = max(dp[sum][a][b],dfs(sum-1,a,b-1) + maze[a][sum-a]);
    30         if(sum - 1 >= 0 && a - 1 >= 0 && b - 1 >= 0)
    31         dp[sum][a][b] = max(dp[sum][a][b],dfs(sum-1,a-1,b-1) + maze[a][sum-a]);
    32     }
    33     else
    34     {
    35         if(sum - 1 >= 0)
    36         dp[sum][a][b] = max(dp[sum][a][b],dfs(sum-1,a,b) + maze[a][sum-a]+maze[b][sum-b]);
    37         if(sum - 1 >= 0 && a - 1 >= 0)
    38         dp[sum][a][b] = max(dp[sum][a][b],dfs(sum-1,a-1,b)+ maze[a][sum-a]+maze[b][sum-b]);
    39         if(sum - 1 >= 0 && b - 1 >= 0)
    40         dp[sum][a][b] = max(dp[sum][a][b],dfs(sum-1,a,b-1) + maze[a][sum-a]+maze[b][sum-b]);
    41         if(sum - 1 >= 0 && a - 1 >= 0 && b - 1 >= 0)
    42         dp[sum][a][b] = max(dp[sum][a][b],dfs(sum-1,a-1,b-1) + maze[a][sum-a]+maze[b][sum-b]);
    43     }
    44     return dp[sum][a][b];
    45 }
    46 
    47 void solve()
    48 {
    49     int m,n;
    50     scanf("%d %d",&m,&n);
    51     memset(dp,-1,sizeof(dp));
    52     memset(maze,0,sizeof(maze));
    53     for(int i = 0; i < m; i++)
    54         for(int j = 0; j < n; j++)
    55         scanf("%d",&maze[i][j]);
    56 
    57     int ans = dfs(n+m-2,m-1,m-1);
    58 
    59     printf("%d
    ",ans);
    60 }
    61 
    62 int main(void)
    63 {
    64     int t,cnt = 0;
    65     scanf("%d",&t);
    66 
    67     while(t--)
    68     {
    69         printf("Case %d: ",++cnt);
    70         solve();
    71     }
    72     return 0;
    73 }
  • 相关阅读:
    java_类承继其他类的内部类例子
    java_接口和抽象类的区别
    java_数组作缓存池的不可变类实例
    C++_归并排序(纯C版)
    C++_归并排序
    C++_快速排序(纯C版本)
    C++_快速排序
    C++_直接插入排序(纯C版)
    C++_直接插入排序
    自定义比较器的用法
  • 原文地址:https://www.cnblogs.com/henserlinda/p/5756679.html
Copyright © 2011-2022 走看看