思维型的dp

题目: 搭积木
参考博客

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int const mod=1000000007;
int n,m;
int h[105];    //每列的高度
char mp[105][105];
int f[105][105][2];        //f[pos][hi][fg][r]表示以pos为起点,r为终点,上一列的高度为hi,上升状态为fg时这个二维区间的方法数。
//因为r可以在使用时更新,所以再优化一维,变成f[pos][hi][fg],具体原因看代码

void get_height(){            //得到每一列的高度 
  for(int j=1;j<=m;++j){   
    for(int i=1;i<=n;++i){
      if(mp[i][j]=='X') break;
      h[j]++;
    }
  }
}

int dfs(int pos,int hi,int fg,int r){   //四个参数分别是:当前位置,上一列的高度,当前列的高度是否可以上升,区间右边界
  if(pos>r){
    return f[pos][hi][fg]=1;
  }
  if(f[pos][hi][fg]!=-1) return f[pos][hi][fg];
  ll sum=0;
  for(int i=1;i<=h[pos];++i){
    if(i>hi){
        if(fg) sum=(sum+dfs(pos+1,i,1,r))%mod;
    }
    else{
        if(i==hi) sum=(sum+dfs(pos+1,i,fg,r))%mod;
        else sum=(sum+dfs(pos+1,i,0,r))%mod;
    }
  }
  return f[pos][hi][fg]=sum;  
}

int main(){
  cin >> n >> m;
  for(int i=n;i>=1;--i){
    for(int j=1;j<=m;++j){
      cin >> mp[i][j];
    }
  }
  get_height();
  ll ans=0,l=1,r=1;
  while(l<=m){
    while(l<=m&&mp[1][l]=='X') l++;
    r=l;
    while(r<=m&&mp[1][r]=='.') r++;
    r--;
    for(int j=l;j<=r;++j){
        memset(f,-1,sizeof(f));
      for(int i=j;i>=l;--i){
        ans=(ans+dfs(i,0,1,j))%mod;
      }
    }
    l=r+1;               //让l变成下一个连续区间的起点
  }
  cout << (ans+1)%mod;  //每一列都不放,也是一种方案
  return 0;
}

这题也可用区间dp做

全部评论

相关推荐

tongx_:海投吧同学,面试中能学到更多东西呢,比如拷打项目,要是觉得没准备好就可以从中厂开始呢,但是腾讯都是无限复活
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
10911次浏览 93人参与
# 你的实习产出是真实的还是包装的? #
1938次浏览 42人参与
# MiniMax求职进展汇总 #
24095次浏览 309人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7621次浏览 43人参与
# 简历第一个项目做什么 #
31729次浏览 339人参与
# 重来一次,我还会选择这个专业吗 #
433520次浏览 3926人参与
# 米连集团26产品管培生项目 #
6014次浏览 216人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187185次浏览 1122人参与
# 牛客AI文生图 #
21445次浏览 238人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152429次浏览 888人参与
# 研究所笔面经互助 #
118956次浏览 577人参与
# 简历中的项目经历要怎么写? #
310324次浏览 4217人参与
# AI时代,哪些岗位最容易被淘汰 #
63764次浏览 826人参与
# 面试紧张时你会有什么表现? #
30508次浏览 188人参与
# 你今年的平均薪资是多少? #
213120次浏览 1039人参与
# 你怎么看待AI面试 #
180105次浏览 1258人参与
# 高学历就一定能找到好工作吗? #
64330次浏览 620人参与
# 你最满意的offer薪资是哪家公司? #
76524次浏览 374人参与
# 我的求职精神状态 #
448113次浏览 3129人参与
# 正在春招的你,也参与了去年秋招吗? #
363477次浏览 2638人参与
# 腾讯音乐求职进展汇总 #
160665次浏览 1112人参与
# 校招笔试 #
471093次浏览 2964人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务