1. 程式人生 > 其它 >[Acwing藍橋杯DP] 1050. 鳴人的影分身

[Acwing藍橋杯DP] 1050. 鳴人的影分身

 

題目連結:1050. 鳴人的影分身 - AcWing題庫

題目大意:t組資料,每組資料有個正整數m分成n個非負數的方案

方案中不考慮順序,例(2,2,3) 和 (2,3,2) 被視為同一種方案

資料範圍:0<= t <=20

                  1<=n,m<=10

分析:這個題資料範圍比較小,雖然可以暴力過,但是容易爆,也可以打表

正確做法是DP,時間複雜度是O(n^2);

ps:這個題中不考慮順序,如果考慮順序的化就是插板

閆氏DP分析法:

集合:f [ i ][ j ] :表示總和為 i ,方案數為 j 。

屬性:  方案數

狀態轉移:

方式劃分    (1) 整個序列的最小值為 0

                  (2)整個序列的最小值大於0

轉移:f [ i ][ j ]=f [ i ][ j -1 ]+f [ i - j  ( i>=j ) ][ j ]

初始化:f [ 0 ][ 0 ] = 1;// 表示沒有數的時候 總和為0 方案成立

程式碼:

#include <bits/stdc++.h>
using namespace std;
const int N=15;
int f[N][N];
int n,m;
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        memset(f,
0,sizeof f); cin>>m>>n; f[0][0]=1;//初始化 for(int i=0;i<=m;i++) { for(int j=1;j<=n;j++) { f[i][j]=f[i][j-1]; if(i>=j)f[i][j]+=f[i-j][j]; } } cout<<f[m][n]<<endl; }
return 0; }

end!!!