很容易想到的dp。设dp[i]表题目所描述的答案,则
可用一个数组储存最优的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;
}