dp之swap交换法
dp之swap交换法
有时dp可以用这种 新旧交替/滚动数组 的写法
框架是:
int cur=0,old=1; //为第一次swap做准备
for(int i=1;i<=t;++i){
swap(cur,old); //交换
for(int j=1;j<=n+1;++j){
dp[cur][v]+=dp[old][j] //求cur数组
}
}
代码:
const int N=35;
const int M=1e6+5;
const int MOD=2017;
vector<int> e[N];
int dp[2][N];
int main()
{
ios::sync_with_stdio(0),cin.tie(0);
int n,m,u,v,t;
cin>>n>>m;
for(int i=0;i<m;++i){
cin>>u>>v;
e[u].push_back(v);
e[v].push_back(u);
}
for(int i=1;i<=n;++i){ //超级源点
e[i].push_back(n+1);
}
for(int i=1;i<=n+1;++i){ //统一添加自环
e[i].push_back(i);
}
cin>>t;
dp[0][1]=1;
int cur=0,old=1;
for(int i=1;i<=t;++i){
swap(cur,old);
for(int j=1;j<=n+1;++j) dp[cur][j]=0;
for(int j=1;j<=n+1;++j){
for(int v:e[j]) dp[cur][v]=((dp[cur][v]+dp[old][j])%MOD+MOD)%MOD;
}
}
ll ans=0;
for(int i=1;i<=n+1;++i){
ans=((ans+dp[cur][i])%MOD+MOD)%MOD;
}
cout<<ans;
return 0;
}
reference:
蓝桥杯官方书籍

浙公网安备 33010602011771号