题目大意:给定n个0,m个1。有多少种排列方式使得任意一段中01的个数差小于等于K?
题解:f[i][j][k][t]表示i个0、j个1、0比1最多多k个、1比0最多多t的方案数。转移显然
我的收获:dp还能这样解决暴力问题……Orz
#include <iostream>
#include <cstdio>
using namespace std;
#define P 12345678
int n,m,k;
int f[155][155][25][25];
inline void up(int &x,int v){
x+=v;if(x>P) x-=P;
}
void work()
{
int p,ans=0;
for(int i=0;i<=n;i++)
for(int j=0;j<=m;j++)
for(int l=0;l<=k;l++)
for(int t=0;t<=k;t++){
p=f[i][j][l][t];
up(f[i+1][j][l+1][max(t-1,0)],p);
up(f[i][j+1][max(l-1,0)][t+1],p);
}
for(int i=0;i<=k;i++)
for(int j=0;j<=k;j++)
up(ans,f[n][m][i][j]);
cout<<ans<<endl;
}
void init(){
cin>>n>>m>>k;
f[0][0][0][0]=1;
}
int main()
{
init();
work();
return 0;
}