結果
問題 | No.611 Day of the Mountain |
ユーザー | heyshb |
提出日時 | 2017-12-11 22:36:20 |
言語 | C++11 (gcc 11.4.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 3,011 bytes |
コンパイル時間 | 1,430 ms |
コンパイル使用メモリ | 161,852 KB |
実行使用メモリ | 108,444 KB |
最終ジャッジ日時 | 2024-05-08 00:00:49 |
合計ジャッジ時間 | 2,819 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | WA | - |
testcase_01 | WA | - |
testcase_02 | WA | - |
testcase_03 | WA | - |
testcase_04 | WA | - |
testcase_05 | WA | - |
testcase_06 | AC | 28 ms
107,604 KB |
testcase_07 | AC | 27 ms
108,444 KB |
testcase_08 | WA | - |
testcase_09 | AC | 27 ms
106,464 KB |
testcase_10 | AC | 27 ms
107,208 KB |
testcase_11 | AC | 27 ms
107,052 KB |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:32:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 32 | scanf("%d%d",&N,&M); | ~~~~~^~~~~~~~~~~~~~ main.cpp:35:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 35 | scanf("%s",s + 1); | ~~~~~^~~~~~~~~~~~
ソースコード
#include <bits/stdc++.h> using namespace std; int N,M; int v[1210][1210]; char s[1210]; typedef long long LL; const int MOD = 201712111; int f0[1210][20]; int f[10][20][1<<17]; bool L[1210][20],U[1210][20]; inline int gg(int x){ return x==-1?1:x; } void upd(int &x){ if (x >= MOD) x-= MOD; } void print(int v) { for (int i=0;i<2;i++) { printf("%d",v%2); v/=2; } } 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++) if (s[j] == '?') v[i][j] = -1; else v[i][j] = s[j] - '0'; } if (N < M) { for (int i=1;i<=M;i++) for (int j=1;j<=i;j++) swap(v[i][j],v[j][i]); swap(N,M); } /* printf("%d %d\n",N,M); for (int i=1;i<=N;i++) { for (int j=1;j<=M;j++)printf("%d ",v[i][j]); puts(""); } puts("");*/ assert(M <= 17); memset(f0,60,sizeof(f0)); f0[1][1] = gg(v[1][1]); for (int i=1;i<=N;i++) for (int j=1;j<=M;j++) { if (i>1) f0[i][j] = min(f0[i][j],f0[i-1][j] + gg(v[i][j])); if (j>1) f0[i][j] = min(f0[i][j],f0[i][j-1] + gg(v[i][j])); } printf("%d\n",f0[N][M]); for (int i=1;i<=N;i++) { for (int j=1;j<=M;j++) { L[i][j] = (f0[i][j] == f0[i][j-1] + gg(v[i][j])); U[i][j] = (f0[i][j] == f0[i-1][j] + gg(v[i][j])); //printf("%d",U[i][j]); } } int up = (1 << M); int ans = 0; memset(f,0,sizeof(f)); f[0][M][1] = 1; U[1][1] = true; int now = 1,last = 0; for (int i=1;i<=N;i++) { for (int k=0;k<up;k++) { f[now][1][k] = 0; if (k & 1) { f[now][1][k] = f[last][M][k]; } else { if (v[i][1] == -1) { f[now][1][k] = f[last][M][k & (~1)] * 9 + f[last][M][k | 1] * 8; } else { f[now][1][k] = f[last][M][k & (~1)]; } upd(f[now][1][k]); } } for (int j=2;j<=M;j++) for (int k=0;k<up;k++) { int &res = f[now][j][k]; res = 0; if (k & (1 << (j - 1))) { int v1 = f[now][j-1][k], v2 = f[now][j-1][k ^ (1 << (j - 1))]; if (k & (1 << (j - 2))) { if (L[i][j]) res = v1 + v2; else res = v1; } else { if (U[i][j]) res = v1; else res = 0; } upd(res); } else { int v1 = f[now][j-1][k], v2 = f[now][j-1][k ^ (1 << (j - 1))]; int b = (v[i][j] == -1)?9:1; if (k & (1 << (j - 2))) { if (L[i][j]) { res = (v1 + v2) % MOD * (b - 1); } else { res = v1 * b % MOD + v2 * (b - 1) % MOD; } } else { if (U[i][j]) { res = v1 * b % MOD + v2 * (b - 1) % MOD; } else { res = (v1 + v2) % MOD * b; } } upd(res); } } /* for (int j=1;j<=M;j++) for (int k=0;k<up;k++) { printf("f[%d][%d][",i,j); print(k); printf("] = %d\n",f[now][j][k]); } */ if (i == N) for (int k=0;k<up;k++) if (k & (1 << (M - 1))) { ans = ans + f[now][M][k]; upd(ans); } now ^= 1; last ^= 1; } printf("%d\n",ans); }