我真的不会写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;
}