\(problem\)

这题 灰常的相似

然后内存可能过大 开个滚动数组

因为数塔问题总是 只需要上面一行的两个状态(这题就是数塔问题)

下面的代码与原题不符。(原题要输出路径)想抄的可以走了

输出路径只需要数组记录一下就好了。

#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 ;
short num[Arr][Arr] ;
bool dp[Arr][Arr][N] ;
bool b[N] ;
char s[Arr] ;
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 j=1; j<=m; j++) dp[n][j][num[n][j]] = true ;
for(register int i=n-1; i>=1; i--)
for(register int j=1; j<=m; j++)
for(register int q=0; q<N; q++) {
if(dp[(i+1)][j-1][q]) dp[i][j][q+num[i][j]] = true ;
if(dp[(i+1)][j+1][q]) dp[i][j][q+num[i][j]] = true ;
}
int Max = -1 ;
for(register int i=1; i<=m; i++)
for(register int q=0; q<N; q++) if(dp[1][i][q] and b[q]) Max = max (Max,q) ;
cout << Max << endl ;
}
signed main() {
#ifdef Online_Judge
freopen("test.in","r",stdin) ;
freopen("testdata.out","w",stdout) ;
#endif
n = In() , m = In() , k = In() ;
for(register int i=1; i<=n; i++) {
scanf("%s",s+1);
for(register int j=1; j<=m; j++) num[i][j] = s[j]&15 ;
}
get(k+1) ;
return Ot() , 0 ;
}
#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 ;
short num[Arr][Arr] ;
bool dp[2][Arr][N] ;
bool b[N] ;
char s[Arr] ;
inline void get(int x) {
memset(b,false,sizeof(b)) ;
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 j=1; j<=m; j++) dp[n&1][j][num[n][j]] = true ;
for(register int i=n-1; i>=1; i--)
for(register int j=1; j<=m; j++)
for(register int q=0; q<N; q++) {
if(dp[(i+1)&1][j-1][q]) dp[i&1][j][q+num[i][j]] = true ;
if(dp[(i+1)&1][j+1][q]) dp[i&1][j][q+num[i][j]] = true ;
}
int Max = -1 ;
for(register int j=1; j<=m; j++)
for(register int q=0; q<N; q++) if(dp[1][j][q] and b[q]) Max = max (Max,q) ;
cout << Max << endl ;
}
signed main() {
#ifdef Online_Judge
freopen("test.in","r",stdin) ;
freopen("testdata.out","w",stdout) ;
#endif
n = In() , m = In() , k = In() ;
for(register int i=1; i<=n; i++) {
scanf("%s",s+1);
for(register int j=1; j<=m; j++) num[i][j] = s[j]&15 ;
}
get(k+1) ;
return Ot() , 0 ;
}

随机推荐

  1. OS X中crt中文乱码

    SecureCRT中显示乱码的话,可以去设置为UTF-8编码: Session Options->Terminal->Appearance->Character Encoding,设 ...

  2. 使用 XMLHttpRequest实现Ajax

    [XMLHttpRequest的概述] 1.XMLHttpRequest最早是在IE5中以ActiveX组件的形式实现的.非W3C标准 2.创建XMLHttpRequest对象(由于非标准所以实现方法 ...

  3. 九度oj 题目1473:二进制数

    题目描述: 大家都知道,数据在计算机里中存储是以二进制的形式存储的. 有一天,小明学了C语言之后,他想知道一个类型为unsigned int 类型的数字,存储在计算机中的二进制串是什么样子的. 你能帮 ...

  4. nyoj 31 5个数求最值

    5个数求最值 时间限制:1000 ms  |  内存限制:65535 KB 难度:1   描述 设计一个从5个整数中取最小数和最大数的程序   输入 输入只有一组测试数据,为五个不大于1万的正整数 输 ...

  5. STL源码剖析 学习笔记 MiniSTL

    https://github.com/joeyleeeeeee97 目录: 第二章 空间适配器 第三章 迭代器 第四章 序列式容器(vector,list,deque,stack,heap,prior ...

  6. SiteMesh2-示例工程

    了解SiteMesh的最佳方法是使用它.假设SiteMesh设置在您的Web应用程序中,本教程将展示如何掌握SiteMesh最强大的方面,如下所示装饰页面: 效果发生在第2步,其中Menu.jsp页面 ...

  7. WCF 配置文件中的MaxStringContentLength & MaxReceivedMessageSize

    中午测试员在测试系统模块时发现无法通过WCF从服务器下载数据,检查配置文件后,建议开发人员修改站点的WEB.CONFIG文件,具体修改对比如下: 旧的: <binding name=" ...

  8. innodb-internals

    https://www.pythian.com/blog/exposing-innodb-internals-via-system-variables-part-1-memory/

  9. 1. MaxCounters 计数器 Calculate the values of counters after applying all alternating operations: increase counter by 1; set value of all counters to current maximum.

    package com.code; import java.util.Arrays; public class Test04_4 { public static int[] solution(int ...

  10. Nexus设备升级5.0方法

    1. 从该页面为您的设备下载适当的系统映像.然后将它解压缩到一个安全的文件夹. 2. 通过 USB 连接到您的计算机. 3. 使用下列的方法,在fastboot mode下启动设备: 使用 adb   ...