当前位置: 首页 > news >正文

cf41d

CF41D Pawn

link

题意

给定一个矩阵,从底走到顶,每次可以向左上或右上移动,求路径上数字和最大且使 \(M\) 可整除,无解输出 -1\(1\leq n,m\leq 100,a_{i,j}\in [0,9]\)

题解

如果没有模 \(k+1\) 的限制的话就是个朴素的二维 dp。有了限制考虑加上一维 \(k\) 表示和模 \(M\) 等于 \(k\)。所以 \(f_{i,j,k}=\max(f_{i,j,k},f_{i+1,j-1,p}+a_{i,j},f_{i+1,j+1,p}+a_{i,j})\),其中 \(p\) 是和去掉 \(a_{i,j}\) 的余数。还要求输出方案数,倒着推回去就行。复杂度 \(O(nmk)\)。aclink。

  • 注意 \(p=(k-a_{i,j}\bmod M+M)\bmod M\),以防止有负数。
  • 注意特判超出边界的各种情况。

代码

#include<bits/stdc++.h>
#define i64 long long
#define L(a,b,c,d) for(int a=b;a<=c;a+=d)
#define R(a,b,c,d) for(int a=b;a>=c;a-=d)using namespace std;
const int N=105;void solve();
int n,m,M,a[N][N],f[N][N][N];signed main(){int Test=1;
//  scanf("%d",&Test);while(Test--) solve();return 0;
}void solve(){scanf("%d%d%d",&n,&m,&M);M+=1;L(i,1,n,1){char s[N];scanf("%s",s+1);L(j,1,m,1) a[i][j]=s[j]-'0';}memset(f,255,sizeof f);L(j,1,m,1) f[n][j][a[n][j]%M]=a[n][j];R(i,n-1,1,1){L(j,1,m,1){L(k,0,M-1,1){int p=(((k-a[i][j])%M)+M)%M;if(j>1&&f[i+1][j-1][p]!=-1) f[i][j][k]=max(f[i][j][k],f[i+1][j-1][p]+a[i][j]);if(j<m&&f[i+1][j+1][p]!=-1) f[i][j][k]=max(f[i][j][k],f[i+1][j+1][p]+a[i][j]);}}}int x=0;L(j,1,m,1){if(f[1][j][0]>f[1][x][0]) x=j;}if(f[1][x][0]<0){printf("-1\n");return;}printf("%d\n",f[1][x][0]);int k=0,p=0,j=x;vector<char> ans;L(i,1,n-1,1){p=(((k-a[i][j])%M)+M)%M;if(j==1) ans.push_back('L'),j++;else if(j==m) ans.push_back('R'),j--;else if(f[i][j][k]==f[i+1][j-1][p]+a[i][j]) ans.push_back('R'),j--;else ans.push_back('L'),j++;k=p;}printf("%d\n",j);reverse(ans.begin(),ans.end());for(char c:ans) printf("%c",c);
}
http://www.hskmm.com/?act=detail&tid=25030

相关文章:

  • 33 ACwing 294 Count The Repetitions 题解
  • 电赛电装实习总结
  • 30 ACwing 291 蒙德里安的梦想 题解
  • 21 ACwing 289 环路运输 题解
  • 26 UVA1630 串折叠 Folding 题解
  • 13 ACwing 283 Polygon 题解
  • 12 ACwing 282 石子合并 题解
  • 11 ACwing 281 Coins 题解
  • 某中心科学家荣获多项计算机技术大奖
  • FFT
  • 4 ACwing 274 Mobile Service 题解
  • 3 ACwing 273 Making the Grade 题解
  • 1 ACwing 271 Mr
  • 2 ACwing 272 LCIS 最长公共上升子序列 题解
  • 用 Haxe 实现英文数字验证码识别
  • 出题四
  • 7 2025 07 15 模拟赛题解
  • 使用 OCaml 实现验证码识别
  • 私有云大数据部署:从开发到生产(Docker、K8s、HDFS/Flink on K8s) - 详解
  • 差分约束模板
  • 17 LCA模拟赛1T2 剧院始于演员 题解
  • 3 2025 04 23 模拟赛总结
  • 14 收心赛3 T1 最长不降子序列 题解
  • 16 LCA模拟赛1T1 密码 题解
  • 吴恩达深度学习课程一:神经网络和深度学习 第二周:神经网络基础(一)
  • 阿里开源规则引擎QLExpress
  • QOJ7411 Bitwise Xor
  • 完整教程:SOC-ESP32S3部分:25-HTTP请求
  • 为什么要采用“接口 - 抽象类 - 实现类”这种三层结构? - 浪矢
  • 对外提供 AI 服务的风险:合规视角与 AI 安全围栏落地指南