题目链接:
Problem - 118D - Codeforces
https://codeforces.com/problemset/problem/118/D
题目大意:
给n1个步兵,n2个骑兵,步兵最大连续k1个,骑兵最大连续k2个。问有多少种排队伍的方式?
思路:
逐一尝试每个位置能放谁。
方法:
dp尝试每种可能。
AC代码:
#include<iostream> using namespace std; typedef long long ll; #define endl "\n" const ll N = 1e2+7 ,M = 1e8; ll dp[N][N][2],n1,n2,k1,k2; void solve(){ cin>>n1>>n2>>k1>>k2; //最后一维0是步兵,1是骑兵 dp[0][0][0]=dp[0][0][1]=1; for(ll i = 0 ; i <= n1 ; i ++) for(ll j = 0 ; j <= n2 ; j ++){ for(ll k = 1 ; k <= k1 && k <= i ; k ++) //步兵与前k1的骑兵有关联 dp[i][j][0] = (dp[i][j][0]+dp[i-k][j][1])%M; for(ll k = 1 ; k <= k2 && k <= j ; k ++) //骑兵与前k2的步兵有关联 dp[i][j][1] = (dp[i][j][1]+dp[i][j-k][0])%M; } cout << (dp[n1][n2][0]+dp[n1][n2][1])%M << endl; return; } int main(){ ll t=1;//cin >> t; while(t--)solve(); return 0; }