1 条题解

  • 0
    @ 2025-4-12 22:03:05

    C++ :

    #include<stdio.h>
    #include<string.h>
    #include<ctime>
    #include<vector>
    #include<algorithm>
    using namespace std;
    
    #define N 1000000000
    inline vector<int> change(int val)
    {
        vector<int>ans;
        while(val)
        {
            ans.push_back(val%N);
            val/=N;
        }
        return ans;
    }
    inline vector<int> equ(vector<int> a)
    {
        vector<int>ans;
        for(int i=0;i<a.size();i++)
            ans.push_back(a[i]);
        return ans;
    }
    inline vector<int> Min(vector<int> a,vector<int> b)
    {
        if(a.size()>b.size()) return b;
        else if(a.size()<b.size()) return a;
        else
        {
            for(int i=a.size()-1;i>=0;i--)
            {
                if(a[i]<b[i]) return a;
                else if(a[i]>b[i]) return b;
            }
            return a;
        }
    }
    inline vector<int> add(vector<int>a,vector<int>b)
    {
        vector<int>ans;
        int l1=a.size(),l2=b.size(),l=0;
        int m=0;
        while(l<min(l1,l2))
        {
            int p=a[l]+b[l]+m;
            m=p/N;
            ans.push_back(p%N);
            l++;
        }
        while(l<l1)
        {
            int p=a[l]+m;
            m=p/N;
            ans.push_back(p%N);
            l++;
        }
        while(l<l2)
        {
            int p=b[l]+m;
            m=p/N;
            ans.push_back(p%N);
            l++;
        }
        if(m!=0) ans.push_back(m);
        return ans;
    }
    inline void Print(vector<int> a)
    {
        for(int i=a.size()-1;i>=0;i--)
        {
            printf("%d",a[i]);
        }
        printf("\n");
    }
    
    vector<int>dp[21][1001];
    inline void init()
    {
        for(int i=3;i<=20;i++)
            dp[i][1].push_back(1);
        for(int i=3;i<=20;i++)
            dp[i][2].push_back(3);
        for(int i=3;i<=1000;i++)
        {
            dp[3][i]=add(dp[3][1],add(dp[3][i-1],dp[3][i-1]));//dp[3][1]);
        }
        for(int i=4;i<=20;i++)
            for(int j=3;j<=1000;j++)
        {        dp[i][j]=add(dp[i-1][1],add(dp[i][j-1],dp[i][j-1]));//,dp[i-1][1]);
            for(int k=2;k<=j;k++)
            {
                dp[i][j]=Min(dp[i][j],add(dp[i-1][k],add(dp[i][j-k],dp[i][j-k])));//dp[i-1][k]));
            }
        }
    }
    
    int main()
    {
        int m,n;
        init();
        //printf("zz\n");
        while(~scanf("%d%d",&m,&n))
        {
            if(n==0)
                printf("0\n");
            else
                Print(dp[m][n]);
        }
    }
    
    

    Java :

    import java.math.BigDecimal;
    import java.math.BigInteger;
    import java.util.Scanner;
    
    public class Main
    {
        public static BigInteger min(BigInteger a,BigInteger b)
        {
            if(a.compareTo(b)<0)
                return a;
            return b;
        }
        public static void main(String args[])
        {
            Scanner cin=new Scanner(System.in);
            int maxn=1100;
            BigInteger dp[][]=new BigInteger[21][maxn];
            for(int i=0;i<maxn;i++)
            {
                dp[2][i]=BigInteger.ZERO;
                dp[3][i]=BigInteger.valueOf(2).pow(i).subtract(BigInteger.ONE);
            }
            dp[2][1]=BigInteger.ONE;
            for(int i=4;i<21;i++)
            {
                dp[i][0]=BigInteger.ZERO;
                for(int j=1;j<maxn;j++)
                {
                    dp[i][j]=dp[i-1][j];
                    for(int k=0;k<=j;k++)
                        dp[i][j]=min(dp[i][j],dp[i][j-k].multiply(BigInteger.valueOf(2)).add(dp[i-1][k]));
                }
            }
            while(cin.hasNext())
            {
                int m=cin.nextInt();
                int n=cin.nextInt();
                System.out.println(dp[m][n]);
            }
        }
    
    }
    
    • 1

    信息

    ID
    2742
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者