結果
問題 | No.611 Day of the Mountain |
ユーザー | Sebastian King |
提出日時 | 2023-12-02 17:59:06 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 258 ms / 2,017 ms |
コード長 | 1,444 bytes |
コンパイル時間 | 1,857 ms |
コンパイル使用メモリ | 203,792 KB |
実行使用メモリ | 21,248 KB |
最終ジャッジ日時 | 2024-09-26 21:19:59 |
合計ジャッジ時間 | 2,978 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 64 ms
21,248 KB |
testcase_01 | AC | 71 ms
21,120 KB |
testcase_02 | AC | 59 ms
21,120 KB |
testcase_03 | AC | 258 ms
21,248 KB |
testcase_04 | AC | 2 ms
5,376 KB |
testcase_05 | AC | 2 ms
5,376 KB |
testcase_06 | AC | 5 ms
6,400 KB |
testcase_07 | AC | 3 ms
6,144 KB |
testcase_08 | AC | 2 ms
5,376 KB |
testcase_09 | AC | 1 ms
5,376 KB |
testcase_10 | AC | 2 ms
5,376 KB |
testcase_11 | AC | 2 ms
5,376 KB |
ソースコード
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int MM=201712111; const int MAXN=2000+10; int n,m; int a[MAXN][MAXN]; ll d[MAXN][MAXN],ans,f[20][131072]; const ll INF=1ll << 60; char s[MAXN]; void upd(ll &x,ll y){x=(x+y)%MM;} int main(){ scanf("%d%d",&n,&m); for (int i=1;i<=n;i++){ scanf("%s",s+1); for (int j=1;j<=m;j++) a[i][j]=((s[j]=='?')?0:(s[j]-'0')); } if (m >= 18){ for (int i=1;i<=m;i++) for (int j=i+1;j<=m;j++) swap(a[i][j],a[j][i]); swap(n,m); } for (int i=0;i<=n;i++) for (int j=0;j<=m;j++) d[i][j]=INF; d[1][1]=(a[1][1]==0)+a[1][1]; for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) if (i!=1||j!=1) d[i][j]=min(d[i-1][j],d[i][j-1])+a[i][j]+(a[i][j]==0); printf("%lld\n",d[n][m]); if (m==1) return 0*puts("1"); int o=1 << m; for (int i=0;i<o;i++) f[1][i]=(i==1); int oo=o-1; for (int cnt=2;cnt<=n * m;cnt++){ int x=(cnt-1)/m+1; int y=(cnt-1)%m+1; int py=(y==1?m:y-1); for (int i=0;i<o;i++)f[y][i]=0; if (a[x][y]==0){ for (int i=0;i<o;i++) if(f[py][i]) upd(f[y][i&(oo^(1<<(y-1)))],f[py][i]*8); a[x][y]=1; } for (int i=0;i<o;i++) if(f[py][i]) if ((d[x-1][y]+a[x][y]==d[x][y]&&((i>>(y-1))&1))||(y>=2&&d[x][y-1]+a[x][y]==d[x][y]&&((i>>(y-2))&1))) upd(f[y][i|(1<<(y-1))],f[py][i]); else upd(f[y][i&(oo^(1<<(y-1)))],f[py][i]); } for (int i=0;i<o;i++) if ((i>>(m-1))) upd(ans,f[m][i]); printf("%lld\n",ans); return 0; }