给定一个棋盘,你从最下面一行任选一个位置开始移动,每次只能向右上方或者左上方移动,求满足经过路径的权值和是 k+1k+1 (给定常数)的倍数的情况下最大权值和是多少。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | #include <iostream> #include <cmath> #include <cstring> using namespace std; const int N=110; int n,m,M,a[N][N],f[N][N][50],p[N][N][50]; void print( int i, int j, int k){ if (i==n){ cout<<j<<endl; return ; } if (p[i][j][k]==1){ print(i+1,j+1,((k-a[i][j])%M+M )%M); cout<< 'L' ; return ; } if (p[i][j][k]==2){ print(i+1,j-1,((k-a[i][j])%M+M )%M); cout<< 'R' ; return ; } } signed main(){ int i,j,k; cin>>n>>m>>M; ++M; for (i=1;i<=n;i++) for (j=1;j<=m;j++){ char c;cin>>c;a[i][j]=c- '0' ;} memset (f,-1, sizeof f) ; for (i=1;i<=m;i++) f[n][i][a[n][i]%M] =a[n][i]; for (i=n-1;i>0;i--) for (j=1;j<=m;j++) for (k=0;k<M;k++){ // if(k>=a[i][j]) int t1=f[i+1][j+1][ ((k-a[i][j])%M+M )%M], t2=f[i+1][j-1][ ((k-a[i][j])%M+M)%M]; if (j+1<=m&&~t1&&t1+a[i][j]>=f[i][j][k]) f[i][j][k] =t1+a[i][j],p[i][j][k]= 1; if (j-1>=1&&~t2&&t2+a[i][j]>=f[i][j][k]) f[i][j][k]=t2+a[i][j],p[i][j][k]=2 ; } int id =0; for (i=1;i<=m;i++) if (f[1][i][0]>f[1][id][0]) id=i; if (f[1][id][0]==-1) {cout<<-1<<endl; return 0;} cout<<f[1][id][0]<<endl; print(1,id,0) ; } |
分类:
dp
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!