京东9.17笔试第三题

简单dp,dp[i][a][b][k]表示i位的字符串,第i位为a,第i-1位为b,之前是否已经含有red(k为1表示有,0表示无) 的方案数,可以使用滚动数组优化掉第一维度
时间复杂度为 n*26*26*26*2,会t掉。故需要优化,可以考虑对字母进行压缩,分别用0,1,2,3来表示字母  r,e,d,其他字母 。这样时间复杂度可以降为n*4*4*4*2 ,具体转移方程可以看代码
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
const int mod = 1e9 + 7;
signed main()
{
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int n;
  cin >> n;
  vector<vector<vector<int>>> dp(5, vector<vector<int>>(5, vector<int>(2, 0)));
  for (int i = 0; i < 4; i++)
    for (int j = 0; j < 4; j++)
      dp[i][j][0] = (i == 3 ? 23 : 1) * (j == 3 ? 23 : 1);
  // R,E,D,$
  for (int i = 2; i < n; i++){
    vector<vector<vector<int>>> rdp(5, vector<vector<int>>(5, vector<int>(2, 0)));
    for (int c = 0; c < 4; c++)
      for (int b = 0; b < 4; b++)
        for (int a = 0; a < 4; a++){
          if (c == 2 && b == 1 && a == 0)//der不转移
            continue;
          rdp[a][b][(c == 0 && b == 1 && a == 2) ? 1 : 0] += dp[b][c][0] * (a == 3 ? 23 : 1);
          rdp[a][b][1] += dp[b][c][1] * (a == 3 ? 23 : 1);
          rdp[a][b][0] %= mod, rdp[a][b][1] %= mod;
        }
    dp = rdp;
  }
  int ans = 0;
  for (int i = 0; i < 4; i++)
    for (int j = 0; j < 4; j++)
      ans += dp[i][j][1], ans %= mod;
  cout << ans << endl;
}


#京东笔试#
全部评论
大佬也太强了吧,是竞赛爷吗,可以和小白加微信交流一下吗
3
送花
回复
分享
发布于 2022-09-17 22:08 广东
大佬也太强了吧,是竞赛爷吗,可以和小白加微信交流一下吗
2
送花
回复
分享
发布于 2022-09-17 22:14 广东
秋招专场
校招火热招聘中
官网直投
求前两题答案
点赞
送花
回复
分享
发布于 2022-09-17 21:22 北京
Hello,我是恒生电子股份有限公司的校园大使,不想简历投递后“泡池子”, 登录链接:campus.hundsun.com/campus/jobs 填写我的推荐码:EVKGKJ 投递,简历第一时间送到HR面前,可查进度,快来投递吧~
点赞
送花
回复
分享
发布于 2022-09-17 22:25 江西
hi~同学,秋招遇“寒气”,牛客送温暖啦!23届秋招笔面经有奖征集中,参与就得牛客会员7天免费体验,最高赢300元京东卡!戳我去看>>>https://www.nowcoder.com/link/zhengjipinglun
点赞
送花
回复
分享
发布于 2022-09-19 15:20 北京
艹 我看到26*26以为是快速幂矩阵快速幂+字符串处理的题。没想到是dp
点赞
送花
回复
分享
发布于 2022-09-22 11:38 北京

相关推荐

8 14 评论
分享
牛客网
牛客企业服务