赣州建网站/seo诊断工具有哪些
题目大意:有n个身高各异的人站成一排,如果某人比他左边所有的人都高,那么它可以往左看到整个队列以外,否则他的视线会被挡住,右边同样。犯罪就在这里开始了。队列左边有一个人用回旋镖杀死了队列右边的一个人。此时恰有P人向左的视野没有没遮挡,R人向右的时也没有被遮挡,这些人都可能是案件的目击证人。辩护律师委托你算出这N个人有多少种可能的排列方法满足给定的P和R。
解题思路:递推,假设现在队列由i-1个人变成了i个,由于谁后进到队列是无所谓的,不妨假设最矮的人是最后一个进入队列的,那么其所占的位置会有三种情况,第一种情况是站在队首,增加1个在前面能看到的人数,第二种情况是站在队尾,增加1个在后面能看到的人数,第三种情况是站在队伍中间,一共有i-2个位置可以站,但不会增加可见的人数。这样就能得到f[i][j][k]=f[i-1][j-1][k]+f[i][j][k-1]+(i-2)*f[i-1][j][k]。
#include <cstdio>int main() {int DP[20][20][20] = {0};DP[1][1][1] = 1;for (int i = 2; i <= 13; i++)for (int j = 1; j <= i; j++)for (int k = 1; k <= i; k++)DP[i][j][k] = DP[i-1][j][k] * (i-2) + DP[i-1][j-1][k] + DP[i-1][j][k-1];int T, N, P, R;scanf("%d", &T);while (T--) {scanf("%d%d%d", &N, &P, &R);printf("%d\n", DP[N][P][R]);}return 0;
}