\(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. Java EE之一个表单两个按钮响应不同界面(登录与注册)
  2. MySQL 变量和条件
  3. YY前端课程2
  4. Android杂谈--小知识点总结(1)
  5. 响应式布局(Responsive layout,RL)的简单Demo
  6. 如何构建JSON数据,JSON数据的格式,JSON数据的获取
  7. hadoop中HBase子项目入门讲解
  8. JavaScript 隐式转换
  9. linux dd命令
  10. JS实现日历控件选择后自动填充
  11. LeetCode &amp; Q88-Merge Sorted Array-Easy
  12. cenos7上部署python3环境以及mysqlconnector2.1.5
  13. Alignment And Compiler Error C2719 字节对齐和编译错误C2719
  14. 【剑指Offer】只出现一次的字符
  15. mydumper备份原理和使用方法
  16. centos6.8下l2tp客户端xl2tpd的安装配置
  17. android 开发 实现多个动态权限的方法(并且兼容6.0以下的版本权限授权)
  18. C#:多线程、线程同步与死锁
  19. OpenCV——漫水填充
  20. 修改selinux出现setsebool: SELinux is disabled.的解决方法

热门文章

  1. Turtle-可视化界面画圣诞树
  2. Django-django-redis使用
  3. [bzoj1820][JSOI2010][Express Service 快递服务] (动态规划)
  4. Unity对象的所有组件深拷贝与粘贴
  5. ace &amp; web ide &amp; web code editor
  6. 转载 - Struts2 拦截器详细配置过程
  7. 公众号开发 jsp中&lt;a&gt;问题
  8. cogs——1298. 通讯问题
  9. 模拟赛 Problem 2 不等数列(num.cpp/c/pas)
  10. Flex 绘制圆形并填充图片