$CF41D\ Pawn$
与这题 灰常的相似
然后内存可能过大 开个滚动数组
因为数塔问题总是 只需要上面一行的两个状态(这题就是数塔问题)
下面的代码与原题不符。(原题要输出路径)想抄的可以走了
输出路径只需要数组记录一下就好了。
#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 ;
}
随机推荐
- python实现字符串转换整数
实现一个函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. 当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续 ...
- Django ContentType内置组件
一.引出问题 假如有这两张表,它们中的课程可能价格不一样.周期不一样.等等...不一样...,现在有一张价格策略表,怎么就用一张表报保存它们之间不同的数据呢? 可能你会这样: 确实是行!但是,如果有很 ...
- vuex----mutation和action的基本使用
我们要实现的很简单,就是点击+1的count加一,点击-1的时候count-1 一.mutation 在vue 中,只有mutation 才能改变state. mutation 类似事件,每一个mu ...
- 2.8 补充:export
linux export 的作用 功能说明:设置或显示环境变量. 语 法:export [-fnp][变量名称]=[变量设置值] 补充说明:在shell中执行程序时,shell会提供一组环 ...
- 数据库——mysql如何获取当前时间---https://www.cnblogs.com/Chenshuai7/p/5136469.html
数据库——mysql如何获取当前时间 1.1 获得当前日期+时间(date + time)函数:now() -------https://www.cnblogs.com/Chenshuai7/p/51 ...
- HDU 1018 阶乘数的位数
题目大意: 将一个数开阶乘后得到的值,来求这个值的位数 n! = 1*2*3*4...*n 对于求一个数的位数的方法为ans = lg(n!) + 1 那么就可以看作 ans = lg(1) + lg ...
- [luoguP2659] 美丽的序列(单调栈)
传送门 单调栈大水题 l[i] 表示 i 能扩展到的左边 r[i] 表示 i 能扩展到的右边 ——代码 #include <cstdio> #include <iostream> ...
- noip模拟赛 蒜头君的排序
分析:其实就是求m个区间的逆序对个数,题目真的是明摆着让我们用莫队算法,套用树状数组就可以了. 具体怎么转移呢?如果移动R,那么对区间[l,r]有影响的是R左边的元素,我们只需要看有多少在R左边比a[ ...
- 【Teamviewer】Teamviewer远程访问工具使用方法
首先电脑必须能访问外网,即使是在局域网内也无所谓. 1.这里以非自动登录.自动受控的方式为例.首先,让对方也安装一个Teamviewer,或运行一个绿色的Teamviewer,并保证网络可通.然后我们 ...
- O - Treats for the Cows 区间DP
FJ has purchased N (1 <= N <= 2000) yummy treats for the cows who get money for giving vast am ...