滴滴笔试==!
没有数据范围。
我做**的题哦。
做题全靠猜。
第一题,不说了,编辑距离,dp,改一改...注意一点细节.. (其实是没保存代码)
第二题,球,组合数学, dp
#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
using namespace std;
const int maxn = 1e5+123;
int idx(char c) {
return c - '0';
}
typedef long long ll;
map<int,int>mp;
vector<int>g[maxn];
ll dp[50][500];
ll C[500][500];
ll A[500];
ll a[3];
int main(int argc, char const *argv[]) {
int n;
C[0][0] = 1;
for (int i = 1; i < 500; i++)
{
C[i][0] = 1;
for (int j = 1; j < i; j++) {
C[i][j] = (C[i-1][j-1] + C[i-1][j]);
}
C[i][i] = 1;
}
A[0] = A[1] = 1;
for (int i = 2;i < 500; i++) {
A[i] = (A[i-1] * i);
}
n = 3;
for (int i = 1; i <= n; i++) scanf("%d",&a[i]);
dp[1][a[1]-1] = 1;
ll sum = a[1];
for (int i = 2; i <= n; i++)
{
for (int j = 0; j < sum; j++)
{
for (int k = 1; k <= a[i]; k++)
{
for(int u = 0; u <= j && u <= k; u++)
{
dp[i][j-u+a[i]-1-(k-1)]=(dp[i][j-u+a[i]-k] + (((dp[i-1][j]*C[j][u])*C[sum+1-j][k-u])*C[a[i]-1][k-1]));
}
}
}
sum += a[i];
}
ll ans = dp[n][0];
if(ans <= 0) std::cout << 0 << '\n';
else std::cout << ans << '\n';
return 0;
}
`#滴滴##笔试题目##题解#