mxqz,样例2死活过不去,少1
查看原帖
mxqz,样例2死活过不去,少1
253765
houpingze楼主2021/7/26 19:48

rt,f[a][b][x][y] 表示队伍里面一共有 a 个步兵、b 个骑兵、以 x 个步兵结 尾、以 y 个骑兵结尾的方案数。

code

#include<bits/stdc++.h>
#define reg register int
#define INF (1<<30)
#define int long long
using namespace std;
int read(){
	int res=0,fs=1; char c=getchar();
	while(!(c>='0' && c<='9')){ if(c=='-')fs=-1; c=getchar(); }
	while(c>='0' && c<='9')res=res*10+c-'0',c=getchar();
	return res*fs;
}
void print(int x){
    if(x<0) { putchar('-'); x=-x;}
    if(x>9) print(x/10);
    putchar(x%10+'0');
}
int n,cnt,m,a[5010],ans,tmp,k;
int f[105][105][12][12];
const int mod=1e8;
signed main() {
	ios::sync_with_stdio(false);
	int a,b,c,d;
	cin>>a>>b>>c>>d;
	f[0][0][0][0]=1;
	// f[0][1][0][1]=1;
	// f[1][0][1][0]=1;
	for(int i=0;i<=1;i++) for(int j=0;j<=1-i;j++) f[0][1][i][j]=(c>=1),f[1][0][i][j]=(d>=1);
	for(int i=1;i<=a;i++){
		for(int j=1;j<=b;j++){
			for(int k=0;k<=c;k++){
				for(int l=0;l<=d;l++){
					// if(i==0&&j==0&&k==0&&l==0) continue;
					ans=0;
					if(k==0&&l==1){
						for(int ccf=1;ccf<=min(c,i);ccf++) ans+=f[i][j-1][ccf][0]; 
						ans%=mod;
					}else if(k==1&&l==0){
						for(int ccf=1;ccf<=min(d,j);ccf++) ans+=f[i-1][j][0][ccf]; 
						ans%=mod;
					}
					else if(k>1) ans+=f[i-1][j][k-1][l];
					else if(l>1) ans+=f[i][j-1][k][l-1];
					// if(k==c) ans+=f[]
					
					f[i][j][k][l]+=ans%mod;
					f[i][j][k][l]%=mod;
					// cout<<f[i][j][k][l]<<endl;
				}
			}
		}
	}
	ans=0;
	for(int i=0;i<=c;i++) ans+=f[a][b][i][0];
	for(int i=0;i<=d;i++) ans+=f[a][b][0][i];
	
	// for(int i=0;i<=c;i++) for(int j=0;j<=d;j++) ans+=f[a][b][i][j],ans%=mod;
	cout<<ans;
    return 0;
}


2021/7/26 19:48
加载中...