題4最大值(findmax)
【題目描述】
找到乙個陣列的最大值的一種方法是從陣列開頭從前到後對陣列進行掃瞄,令max=a[0](陣列下表從0..n-1),如果a[i]>max,就更新max,這樣就可以在o(n)的時間裡找到乙個陣列的最大值。
這個問題是相當簡單的,但是想到了另乙個問題,如果乙個包含n個元素的陣列a裡面的元素的值是在1...k之間的整數,存在多少個不同的陣列a,進行了如上掃瞄之後,max恰好進行了p次更新?
下面是n = 4,k = 3,p = 2時所有情況
1) 2)
3) 4)
5) 6)
共有6種情況
由於答案可能很大,所以你僅僅需要把答案mod (10^9+7)輸出。
【輸入格式】
輸入檔案findmax.in的第一行t,本題有t組資料。
接下來t行,每行三個整數n,k,p
【輸出格式】
輸出檔案findmax.out包括t行,每行乙個答案。
【樣例輸入】
4 3 2
2 3 1
3 4 1
【樣例輸出】
【資料規模】
30%資料
t=11 <= n <= 10
1 <= k <= 2
0 <= p < n
60%資料
t=11 <= n <= 50
1 <= k <= 10
0 <= p < n
100%資料
1 <= t <= 100
1 <= n <= 100
1 <= k <= 300
0 <= p < n
我說什麼鬼,100 * 100 * 300 * 100還能不炸?原來離線了。。。
令f(i, j, k)表示前i個數,最大值為j,更新了k次的方案數,則
f(i, j, k) = f(i - 1, j, k) * j + f(i - 1, 1, k - 1) + f(i - 1, 2, k - 1) + ... + f(i - 1, j - 1, k - 1)
用s(i, j, k)表示f(i, 1, k) + f(i, 2, k) + ... + f(i, j, k),則
f(i, j, k) = f(i - 1, j, k) * j + s(i - 1, j - 1, k - 1),
其中f(i - 1, j, k) * j表示最大值不變,則第i位可以是閉區間[1, j]之間的數,s(i - 1, j - 1, k - 1)表示最大值更新為j。
#include #include const int maxn = 105, mod = 1000000007;int t, n, max_k, p;
long long f[maxn][305][maxn], s[maxn][305][maxn];
int main(void)
for (int i = 2; i < 101; ++i)
} }while (t--)
return 0;
}
最大值 紀中1857 dp
找到乙個陣列的最大值的一種方法是從陣列開頭從前到後對陣列進行掃瞄,令max a0,如果a i max,就更新max,這樣就可以在o n 的時間裡找到乙個陣列的最大值。這個問題是相當簡單的,但是想到了另乙個問題,如果乙個包含n個元素的陣列a裡面的元素的值是在1 k之間的整數,存在多少個不同的陣列a,進...
int 最大值 239 滑動視窗最大值
給定乙個陣列 nums,有乙個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗內的 k 個數字。滑動視窗每次只向右移動一位。返回滑動視窗中的最大值。示例 輸入 nums 1,3,1,3,5,3,6,7 和 k 3 輸出 3,3,5,5,6,7 解釋 滑動視窗的位置 最大...
算式最大值
演算法給定 1 n個正整數a1,a2,an 2 p個加號 和q個減號 p q n 1 3 k對括號 請你使用全部整數 加減號和括號,組成乙個合法的算式 a1 an在算式中的順序隨意 使得算式的結果最大。注意加減號只能作為二元運算子出現在算式中,不能作為正負號。括號可以出現在算式最左和最右,例如 1 ...