提出 #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;
}
提出情報
ジャッジ結果
| セット名 |
All |
| 得点 / 配点 |
100 / 100 |
| 結果 |
|
| セット名 |
テストケース |
| 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 |