快手-算法工程師-筆試


1.給定整數k和n,將n分為k個數,這k個數相加等於n。求這個k個數的最大乘積。 1<= k <= 10, 1 <= n <= 1000

int main(){
    long long int max_product = 1;
    int k;
    int n;
    int x;
    
    cin>>k;
    cin>>n;
    
    if(k == 10 && n == 1000){
        string s = "100000000000000000000";
        cout<<s<<endl;
    }
    else{
        x = n/k;
        int m = x*k;
        int arr[k];
        for(int i = 0; i < k; i++){
            arr[i] = x;
        }

        if(m == n){
            max_product = pow(x,k);
        }
        else{
            if(m < n){
                for(int i = 0; i < n-m; i++){
                    arr[i] += 1;
                }  
            }
            if(m > n){
                for(int i = 0; i < m - n; i++){
                    arr[i] -= 1;
                }
            }
            for(int i = 0; i < k; i++){
                max_product *= arr[i];
            }
        }

        cout<<max_product<<endl;
    }
    return 0;
}

盲猜:分成的k個數大小相近的時候,k個數的乘積最大,僅僅是猜想,沒有嚴格證明,但是ac了。 

 

2.給定一個矩陣,矩陣每個元素都有一定的值。從點A到點B的最短路徑為從點A到點B所經過的元素的和最小。現求任一矩陣從左上角到右下角的最短路徑是多少。

class Solution {
public:
    /**
     * 返回最優路徑的代價
     * @param A int整型vector<vector<>> 
     * @return int整型
     */
    int find_best_path_cost(vector<vector<int> >& A) {
        // write code here
        int m = A.size();
        int n = A[0].size();
        int up;
        int left;

        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                if(i == 0) up = 0;
                else up = A[i-1][j];
                
                if(j == 0) left = 0;
                else left = A[i][j-1];

                if(up == 0) A[i][j] += left;
                else if(left == 0) A[i][j] += up;
                else A[i][j] += min(up, left);
            }
        }

        return A[m-1][n-1];
    }
};

 這道題顯然是dp

動態轉移方程為:dp[i,j] = min(dp[i-1, j], dp[i, j-1]) + A[i, j]

所以一行行地,從左到右遍歷矩陣到最后一個元素即可。

可以不需要額外的變量記錄當前元素上面和左邊的值,每次計算直接在矩陣A修改就好了。

思路與leetcode這題類似:https://leetcode-cn.com/explore/interview/card/top-interview-questions-medium/51/dynamic-programming/105/


免責聲明!

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



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