标签:ref sdi bit signed sig std int blog lock
与这题 灰常的相似
然后内存可能过大 开个滚动数组
因为数塔问题总是 只需要上面一行的两个状态(这题就是数塔问题)
下面的代码与原题不符。(原题要输出路径)想抄的可以走了
输出路径只需要数组记录一下就好了。
#ifdef Dubug
#endif
#include <bits/stdc++.h>
using namespace std;
typedef long long LL ;
inline LL In() {
LL res(0),f(1);
register char c ;
while(isspace(c=getchar())) ;
c == '-'? f = -1 , c = getchar() : 0 ;
while(res = (res << 1) + (res << 3) + (c & 15) , isdigit(c=getchar())) ;
return res * f ;
}
int n , m , k ;
const int N = 900 + 5 ;
const int Arr = 100 + 5 ;
char a[Arr][Arr] ;
short num[Arr][Arr] ;
bool dp[2][Arr][N] ;
bool b[N] ;
inline void get(int x) {
for(register int i=1; i<=N/x; i++) b[i*x] = true ;
return ;
}
inline void Ot() {
memset(dp,0,sizeof(dp)) ;
for(register int i=1; i<=n; i++)
for(register int j=1; j<=m; j++) dp[i][j][num[i][j]] = true ;
for(register int i=n; i>=1; i--)
for(register int j=1; j<=m; j++)
for(register int k=0; k<=N; k++) {//滚动数组优化qwq
if(dp[(i+1)&1][j-1][k] == true) dp[i&1][j][k+num[i][j]] = true ;
if(dp[(i+1)&1][j+1][k] == true) dp[i&1][j][k+num[i][j]] = true ;
}
int Max = -1 ;
for(register int i=1; i<=m; i++)
for(register int k=0; k<=N; k++) if(dp[1][i][k] and b[k]) Max = max (Max,k) ;
cout << Max << endl ;
}
signed main() {
ios::sync_with_stdio(false) ;
n = In() , m = In() , k = In() ;
for(register int i=1; i<=n; i++)
for(register int j=1; j<=m; j++) {
cin >> a[i][j] ;
num[i][j] = a[i][j] - 48 ;
}
get(k+1) ;
return Ot() , 0 ;
}
标签:ref sdi bit signed sig std int blog lock
原文地址:https://www.cnblogs.com/qf-breeze/p/10630924.html