2484 整数划分

很容易想到的dp。设dp[i]表题目所描述的答案,则

dp[i]=max(dp[i],dp[i-j]*dp[j])

可用一个数组储存最优的j,然后输出,发现:j为2或3。当i%3==0时,j为3;当i%3!=0,j为2

因为dp[2]=2,dp[3]=3所以可以这样做:

if (i % 3 == 0)
    dp[i] = 3 * dp[i - 3];
else
    dp[i] = 2 * dp[i - 2];

当i%3==0时,(i%3)==0,所以dp[i]=3^(i/3)

如果i%3!=0,就一直减2,知道是3的倍数,就按照上述方法做,所以可以记录减了多少个2。假如减了sum个2,由i减成了j,则:

dp[i]=(2^sum)*(3^(j/3))

所以可以不用dp数组,直接开高精算出来(实际就是一个贪心)

不用高精的代码如下(可用快速幂):

#include<cstdio>
int mypow(int x,int y)
{
    int sum = 1,i;
    for(i = 1;i <= y;i++){
        sum *= x;
    return sum;
}
int main()
{
    int n,x = 0,y,ans;
    scanf("%d",&n);
    while(n % 3 != 0){
        n -= 2;
        x++;
    }
    ans = mypow(2,x);
    y = n / 3;
    ans *= mypow(3,y);
    printf("%d",ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44025325/article/details/86068741