2018年奇虎360春招筆試題--玫瑰花


 

這道題,第一感覺想用排列組合做,但是想了好久,沒想到解決辦法(剛剛考試的時候沒有答出來)。后來想了一下應該使用動態規划來做。

我們首先分析一下情況:

1.當K>N的時候,countSum = 0;

2.當K=N的時候,countSum = N!(N的階乘)

3.當K>N的時候,就要通過最優子結構來進行分析了。

前兩點易知,下面主要分析第三點。

設F(k,n)為n個位置,k種玫瑰的結果,則 F(k,n) = k*(F(k,n-1)+F(k-1,n-1)),分析:

情況一:n-1個空缺已經放置了k種花,則新的位置放置任何一種花都可以,此時結果總數為k*F(k,n-1);

情況二:n-1個空缺已經放置了k-1種花(注意!有k種選擇!),則新的位置固定需要放置剩下的那一種花,此時結果總數為k*F(k-1,n-1);

總數 = 情況一 + 情況二

代碼如下:

public class Rose {
    public static void main(String[] args){
        System.out.println(roseSum(2,3));
    }
    
    public static long roseSum(int k,int n){
        if(k>n) return 0;
        if(k == n){
            int count = 1;
            for(int i = 0;i<n;i++)
                count*=i;
            return count;
        }
        long[][] DP = new long[k][n];
        for(int i = 0 ;i<n;i++)
            DP[0][i] = 1;
        for(int i = 1;i<k;i++)
            DP[i][0] = 0;
        for(int i = 1;i<k;i++)
            for(int j = 1;j<n;j++)
                DP[i][j] = (i+1)*(DP[i][j-1]+DP[i-1][j-1]);
        return DP[k-1][n-1]%772235;        
    }
}

 

不過此代碼雖然是使用動態規划解決,但是空間復雜度為O(N*K),並不是最優,還可繼續優化。

優化代碼如下:

public class Rose {
    public static void main(String[] args){
        System.out.println(roseSum(2,3));
    }
    
    public static long roseSum(int k,int n){
        if(k > n) return 0;
        if(k == n){
            int count = 1;
            for(int i = 0;i<n;i++)
                count*=i;
            return count;
        }
        long[][] DP = new long[2][n];
        for(int i = 0 ;i<n;i++)
            DP[0][i] = 1;
        DP[1][0] = 0;
        for(int i = 1;i<k;i++)
            for(int j = 1;j<n;j++)
                if((i&1)==1){//此時i是奇數
                    DP[1][j] = (i+1)*(DP[1][j-1]+DP[0][j-1]);
                }else{
                    DP[0][j] = (i+1)*(DP[0][j-1]+DP[1][j-1]);
                }
        return DP[(k-1)&1][n-1]%772235;        
    }
}

 

這回的空間復雜度為O(N)。

 

自己想出來的,不一定准確,沒經過大量試驗,如有錯誤,請各位朋友指出,謝謝~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM