提出 #1625320


ソースコード 拡げる

#include <bits/stdc++.h>
#define int long long
#define N 55
using namespace std;
const int INF = 1LL<<55;
int Max(int &a,int b){return a=max(a,b);}
int Min(int &a,int b){return a=min(a,b);}
int h,w;
string mp[N];
int dx[] = {0,1};
int dy[] = {1,0};

int mem1[N][N][N][N],used1[N][N][N][N];
int dfs1(int y,int x,int gy,int gx){
  int num1 = mp[y][x] - '0';  
  if(y == gy && x == gx) return num1;
  if(used1[y][x][gy][gx]++) return mem1[y][x][gy][gx];


  int res = -1;
  for(int i=0;i<2;i++){
    for(int j=0;j<2;j++){
      int nx = x + dx[i];
      int ny = y + dy[i];
      int nnx = nx + dx[j];
      int nny = ny + dy[j];
      int num2 = mp[nny][nnx] - '0';
      char en = mp[ny][nx];
      if(nnx > gx || nny > gy)continue;
      if(en == '*')  Max(res,num1 * dfs1(nny,nnx,gy,gx));
      if(en == '+')  dfs1(nny,nnx,gy,gx);
      Min(res,INF);
    }
  }
  return mem1[y][x][gy][gx] = res;
}

int mem2[N][N][2],used2[N][N][2];
int dfs2(int y,int x,int f){
  int num1 = mp[y][x] - '0';
  if(y == h-1 && x == w-1) return f? 0:num1;
  if(used2[y][x][f]++) return mem2[y][x][f];
  
  int res = 0;
  for(int i=0;i<2;i++){
    for(int j=0;j<2;j++) {
      int nx = x + dx[i];
      int ny = y + dy[i];
      int nnx = nx + dx[j];
      int nny = ny + dy[j];
      if(nnx >= w || nny >= h || mp[ny][nx] != '+') continue;
      if(f == 0)  Max(res,num1 + dfs2(nny,nnx,0));
      else Max(res,dfs2(nny,nnx,0));
    }
  }

  if(f == 0){
    for(int ny=y;ny<h;ny++)
      for(int nx=x;nx<w;nx++){
	if((nx+ny)%2 == 1 || (nx == x && ny == y)) continue;
	dfs1(y,x,ny,nx);
	if(mem1[y][x][ny][nx]==-1)continue;
	Max(res,mem1[y][x][ny][nx] + dfs2(ny,nx,1));
      }
  }
  return mem2[y][x][f] = min(res,INF);
}

signed main (){

  cin>>h>>w;
  for(int i=0;i<h;i++) cin>>mp[i];
  
  //  for(int i=0;i<h;i++)
  //for(int j=0;j<w;j++) dfs1(0,0,i,j);

  
  int ans = max(dfs2(0,0,0),dfs2(0,0,1));
  if(ans > (int)1e15) ans = -1;
  cout<<ans<<endl;

  return 0;
}

提出情報

提出日時
問題 E - Route Calculator
ユーザ beet_ga_inai
言語 C++14 (GCC 5.4.1)
得点 100
コード長 2032 Byte
結果 AC
実行時間 58 ms
メモリ 132480 KiB

ジャッジ結果

セット名 All
得点 / 配点 100 / 100
結果
AC × 39
セット名 テストケース
All 00_sample_00, 00_sample_01, 00_sample_02, 00_sample_03, 10_small_0, 10_small_1, 10_small_2, 10_small_3, 10_small_4, 10_small_5, 10_small_6, 10_small_7, 10_small_8, 10_small_9, 20_random_0, 20_random_1, 20_random_2, 20_random_3, 20_random_4, 20_random_5, 20_random_6, 20_random_7, 20_random_8, 20_random_9, 30_unbalance00, 30_unbalance01, 30_unbalance02, 30_unbalance03, 30_unbalance04, 30_unbalance05, 30_unbalance06, 30_unbalance07, 30_unbalance08, 30_unbalance09, 30_unbalance10, 90_custom0, 90_custom1, 90_custom2, 90_custom3
ケース名 結果 実行時間 メモリ
00_sample_00 AC 3 ms 8448 KiB
00_sample_01 AC 2 ms 4352 KiB
00_sample_02 AC 4 ms 12544 KiB
00_sample_03 AC 6 ms 24832 KiB
10_small_0 AC 6 ms 24832 KiB
10_small_1 AC 2 ms 4352 KiB
10_small_2 AC 1 ms 256 KiB
10_small_3 AC 3 ms 8448 KiB
10_small_4 AC 3 ms 8448 KiB
10_small_5 AC 4 ms 12544 KiB
10_small_6 AC 2 ms 4352 KiB
10_small_7 AC 4 ms 16640 KiB
10_small_8 AC 3 ms 10496 KiB
10_small_9 AC 4 ms 12544 KiB
20_random_0 AC 8 ms 33152 KiB
20_random_1 AC 5 ms 20992 KiB
20_random_2 AC 18 ms 78464 KiB
20_random_3 AC 15 ms 58112 KiB
20_random_4 AC 21 ms 90752 KiB
20_random_5 AC 10 ms 45568 KiB
20_random_6 AC 8 ms 37120 KiB
20_random_7 AC 15 ms 66048 KiB
20_random_8 AC 5 ms 16768 KiB
20_random_9 AC 4 ms 12672 KiB
30_unbalance00 AC 45 ms 132352 KiB
30_unbalance01 AC 45 ms 132352 KiB
30_unbalance02 AC 45 ms 132352 KiB
30_unbalance03 AC 46 ms 132352 KiB
30_unbalance04 AC 46 ms 132352 KiB
30_unbalance05 AC 48 ms 132352 KiB
30_unbalance06 AC 48 ms 132352 KiB
30_unbalance07 AC 52 ms 132352 KiB
30_unbalance08 AC 54 ms 132480 KiB
30_unbalance09 AC 57 ms 132352 KiB
30_unbalance10 AC 57 ms 132352 KiB
90_custom0 AC 48 ms 132352 KiB
90_custom1 AC 58 ms 132352 KiB
90_custom2 AC 2 ms 4480 KiB
90_custom3 AC 2 ms 4480 KiB