oj acm 1028

原題鏈接

整數劃分

f(n,m)表示將整數n劃分最大值不超過m的等式個數

n=1或者m=1時,f(n,m)=1  ,n=1時只能有一種(1),m=1時,只能有(1,1,...1)這一種。

當n=m時,f(n,m)=f(n,n-1)+1,即爲(n)加上劃分爲最大值不超過n-1的個數。

當m>n時,f(n,m)=f(n,n),m不可能最大劃分值大於n.

當m<n時,f(n,m)=f(n-m,m)+f(n,m-1),第一中情況劃分一定包含m,剩下n-m繼續劃分劃分。

第二中情況不包含m,即所有的劃分值比m小f,即f(n,m-1)

 

注意:動態規劃,劃分的子問題往往不是相互獨立的,所以要將子問題的答案保存起來。

import java.util.Scanner;

public class Main_1028 {
    private static int count = 0;
    private static int[][] memo = new int[121][121];
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while(in.hasNext()){
            int n = in.nextInt();
            count = 0;
            System.out.println(getEquation(n,n));
        }
    }
    public static int getEquation(int n,int m){
        if(memo[n][m]!=0){
            return memo[n][m];
        }
        if(n < 1 || m < 1){
            return 0;
        }
        if(n==1 || m==1){
            return memo[n][m] = 1;
        }
        if(n > m) {
            return memo[n][m] = getEquation(n - m, m) + getEquation(n, m - 1);
        }
        if(n == m){
            return memo[n][m] = getEquation(n,n-1)+1;
        }
       
            return memo[n][m] = getEquation(n,n);
       
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章