【二维dp+状态压缩】地板覆盖 状态压缩二-我真的不会写dp

我真的不会写dp。。

老是在边缘条件,特殊输入,stl库(此处是错用resize)的使用,

其它错误,函数调用传错变量,下标写错,循环溢界,不胜枚举。

碰到dp,最保险的办法写时也写好测试输出。找个小样例测试一下,很快就定位到问题。

不然一大堆vector、多维数组就像黑盒子一样,分分钟搞死你啊。

#include <iostream>
using namespace std;
#include <vector>
typedef long long int ll;
int dp(vector<vector<int> >&mat,int n,int mod){
  int s=mat.size();
  if(s<=1) return 0;//@error,特殊输入

  vector<vector<ll> > cnt(2,vector<ll>(s,0));
  cnt[0][s-1]=1; //@error: not xx[0][0]=1,边缘条件

  for(int i=1;i<=n;i++){
    int cur=i%2,pre=1-cur;
    //cnt[cur].resize(s,0);//@error:are you sure this will memset it to 0? should use ‘std::fill’ below instead.
    std::fill(cnt[cur].begin(),cnt[cur].end(),0);
    for(int j=0;j<s;j++){
      for(int _k=0;_k<mat[j].size();_k++){
        int k=mat[j][_k];
        cnt[cur][k]=(cnt[cur][k]+cnt[pre][j])%mod;
      }
    }
  }
  return cnt[n%2][s-1];
}
int main(){
  int n,m;
  cin>>n>>m;
  int s=1<<m;

  vector<vector<int> > mat(s,vector<int>());
  for(int i=0;i<s;i++){
    for(int j=0;j<s;j++){
      bool c=1;
      int k=0;
      while(k<m){
        int a=i&(1<<k),b=j&(1<<k);
        if(a&&b){
          int _k=k;k++;//
          while(k<m){//@error: k<m&&a&&b
            if(!((i&(1<<k))&&(j&(1<<k)))) break;
            k++;
          }
          if((k-_k)%2) {c=0;break;}
        }
        else if(!a&!b){ c=0;break;}
        else k++;
      }
      if(c) mat[i].push_back(j);
    }
  }
  /*for(int i=0;i<s;i++){
    for(int j=0;j<mat[i].size();j++){
      cout<<i<<"->"<<mat[i][j]<<" ";
    }
    cout<<endl;
  }*/
  cout<<dp(mat,n,1000000007)<<endl;//@error: not dp(mat,n,s)
  return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值