首页 > 其他分享 >题解 CF41D

题解 CF41D

时间:2023-07-17 21:45:47浏览次数:41  
标签:11 int 题解 bmod CF41D max tie

基础 DP 题。

定义 \(f_{i,j,k}\) 表示从第一行走到 \((i,j)\),且数字总和模 \(p\) 等于 \(k\)。

转移方程为:

\[f_{i+1,j-1,(k+a_{i+1,j-1})\bmod p}=\max (f_{i,j,k}+a_{i+1,j-1}) \]

\[f_{i+1,j+1,(k+a_{i+1,j+1})\bmod p}=\max(f_{i,j,k}+a_{i+1,j+1}) \]

同时还需要定义 \(g_{i,j,k}\) 表示当前状态是由哪一种转移过来的。

注意边界情况。

复杂度 \(O(n^2)\)。

code:

#include<bits/stdc++.h>
using namespace std;
const int N=100+5,inf=INT_MAX/2;
int n,m,p,f[N][N][11],a[N][N],g[N][N][11];
int main(){
  ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  cin>>n>>m>>p;++p;
  for(int i=1;i<=n;++i){
    for(int j=1;j<=m;++j){
      char x;cin>>x;
      a[i][j]=x-'0';
      for(int k=0;k<p;++k)f[i][j][k]=-inf;
    }
  }
  for(int j=1;j<=m;++j)f[1][j][a[1][j]%p]=a[1][j];
  for(int i=1;i<n;++i){
    for(int j=1;j<=m;++j){
      for(int k=0;k<p;++k){
        int tk=(k+a[i+1][j-1])%p,val=f[i][j][k];
        if(j>1&&f[i+1][j-1][tk]<val+a[i+1][j-1]){
          f[i+1][j-1][tk]=val+a[i+1][j-1];
          g[i+1][j-1][tk]=1;
        }
        tk=(k+a[i+1][j+1])%p;
        if(j<m&&f[i+1][j+1][tk]<val+a[i+1][j+1]){
          f[i+1][j+1][tk]=val+a[i+1][j+1];
          g[i+1][j+1][tk]=0;
        }
      }
    }
  }
  int w=1;
  for(int j=1;j<=m;++j){
    if(f[n][j][0]>f[n][w][0]){
      w=j;
    }
  }
  if(f[n][w][0]<0){
    cout<<-1<<endl;
    return 0;
  }
  cout<<f[n][w][0]<<endl;
  cout<<w<<endl;
  int i=n,j=w,k=0;
  while(i>=2){
    if(g[i][j][k]){
      cout<<"R";
      k=(k-a[i][j]%p+p)%p;--i;++j;
    }else {
      cout<<"L";
      k=(k-a[i][j]%p+p)%p;--i;--j;
    }
  }
  return 0;
}

标签:11,int,题解,bmod,CF41D,max,tie
From: https://www.cnblogs.com/HQJ2007/p/17561328.html

相关文章

  • 题解 P6091 【模板】原根
    题解太高深,自己整理一份。阶的定义:若\(\gcd(a,m)=1\),则使\(a^l\equiv1\pmod{m}\)的最小的\(l\)称为\(a\)关于模\(m\)的阶,记为\(\operatorname{ord}_ma\)。阶的性质:根据欧拉定理,\(a^{\varphi(m)}\equiv1\pmod{m}\),所以\(\operatorname{ord}_ma\mid\varphi(m)\)......
  • 题解 CF417D
    \(m\le20\),状压DP。首先可以根据每个人的\(k\)从小到大排序。定义\(f_{i,j}\)表示考虑到第\(i\)个人,完成了\(j\)状态的题目,不考虑显示器所需的最小价格。转移显然为\(f_{i,j|s_i}=\min(f_{i-1,j}+x_i)\)。最终答案为\(ans=\min\limits_{i=1}^{n}f_{i,S}+b\cdotk_......
  • 题解 CF985E
    贪心+DP。先从小到大排序。定义\(f_i\)表示序列\([1,i]\)能否分组。转移为\(f_i|=f_j[a_i-a_j\led,j\lei-k+1]\)。右区间可以直接算出来,左区间可以二分或根据单调性弄个指针。定义\(sum_i=\sum\limits_{t=1}^{i}f_t\),前缀和减一下判断是否为正即可。复杂度\(O(n\lo......
  • 题解 P4815 [CCO2014] 狼人游戏
    看题目限制,可以发现如果将机器人作为点,指控和保护关系作为边,可以建出一个森林,就下来就是传统的树形背包了。设\(f_{i,j,0/1}\)表示当前点为\(i\),子树内有\(j\)个狼人,当前点是否为狼人的方案数。初始化:\(f_{u,0,0}=f_{u,1,1}=1\)当前点为狼:指控:\(f_{u,j,1}=f_{u,j-k,......
  • 题解 [ABC276F] Double Chance
    很容易想到分类。我们可以把\(1\)到\(i-1\)的球分为两类,一类是权值小于\(val_i\),另一类是权值大于\(val_i\)。对于第一类,\(sum\)加上小于\(val_i\)的球的个数乘以\(val_i\)。对于第二类,\(sum\)加上所有大于\(val_i\)的球的权值。这显然可以用两个树状数组维护。......
  • 题解 P5426 [USACO19OPEN]Balancing Inversions G
    来一篇简单易懂的良心题解。由于数值不是\(0\)就是\(1\),我们可以考虑将逆序对的统计方式化简。以左区间为例,设\(x\)为\(1\)的个数,\(p_i\)为第\(i\)个\(1\)的坐标,则逆序对个数为\(\sum\limits_{i=1}^{x}n-p_i-(x-i)\)。也就是\((n-x)\cdotx+\frac{x\cdot(x+1)}{......
  • 题解 Friendly Spiders
    FriendlySpiders带有技巧的最短路。如果\(u\)能到\(v\),说明\(\gcd(u,v)>1\),也就是有相同因子。所以我们考虑对于每个数\(u\),向他的所有质因子连一条长度为\(1\)的边,这样我们从\(u\)到\(v\)需要走两步,最终答案除以\(2\)即可。每次遇到一个新的因子,都要新建节点。......
  • 题解 The Human Equation
    TheHumanEquation思维题。我们考虑每次\(a\)数组加一减一对于其前缀和\(sum\)的影响。可以发现,假设相邻两次加一和减一的位置分别为\(l\)和\(r\),那么\(sum\)在\([l,r)\)内会加一。先减后加也同理。所以,一次加减操作相当于将\(sum\)若干段连续序列加一或减一。......
  • 题解 [ARC153B] Grid Rotations
    [ARC153B]GridRotations有思维含量的一题。我们横纵坐标分开考虑,对于每一个矩形,每次操作会使其内部元素的横坐标上下对调。纵坐标也同理,左右对调。而这种反转操作我们显然可以直接用两棵文艺平衡树维护,复杂度\(O(n\logn)\)。标程的做法更巧妙一下。我们可以把一条链收尾......
  • 题解 Yet Another Minimization Problem
    YetAnotherMinimizationProblem神仙题。第一眼看上去就是DP。定义\(f_{i,j}\)表示当前点\(i\),分\(j\)段的最小费用。\(f_{i,j}=\min(f_{i,j},f_{k,j-1}+val_{k+1,i})\)然后发现复杂度\(O(n^2k)\),直接T飞,需要优化。我们发现\(j\)那一维可以滚掉,也就是只考虑第......