没有报京东,看QQ群里别人做题,居然这么难,做了一下寻宝问题,花了2个小时
#include <cmath>
int Cmn(int m, int n) {
if (m == 0)return 1;
if (n == 0)return 1;
if (m ==n)return 1;
if (n > m / 2)n = m - n;
double sum = 0.0;
for (int i = m;i >= m - n + 1;i--)
sum += log((double)i);
for (int i = 1;i <= n;i++)
sum -= log((double)i);
sum -= log(1000000007.0);
return round((exp(sum)-(int)exp(sum))*1000000007.0);
}
void means(vector<vector<int> >& in, int n, int m, vector<int> values,int K,int * counts) {
int N = in.size();
int M = in[0].size();
if (n == N || m == M) {
return;
}
if (values.empty())values.push_back(-1);
if (values.size() == K) {
means(in, n + 1, m, values, K, counts);
means(in, n, m+1, values, K, counts);
if (in[n][m] > values.back())
{
*counts += Cmn(N - n + M - m - 2, N - n - 1);
*counts %= 1000000007;
}
}
else {
means(in, n + 1, m, values, K, counts);
means(in, n , m+1, values, K, counts);
if (in[n][m] > values.back()) {
values.push_back(in[n][m]);
means(in, n + 1, m, values, K, counts);
means(in, n, m + 1, values, K, counts);
}
}
}
int main() {
int n, m, k;
cin >> n >> m >> k;
int counts=0;
vector<vector<int> > in;
int tmp;
for (int i = 0;i < n;i++)
{
vector<int>vtmp;
for (int j = 0;j < m;j++)
{
cin >> tmp;
vtmp.push_back(tmp);
}
in.push_back(vtmp);
}
vector<int>values;
means(in, 0, 0, values, k, &counts);
cout << counts << endl;
return 0;
}
测试用例
3 3 2
1 3 2
3 2 4
5 3 9
手算51,机算51. 其他几个例子也通过了,不知道是不是可以通过京东的测试!