最少步数到1 简单dp

为什么我这么菜,还以为是个傻逼贪心,结果wa了十发。

给你一个数n,可以进行三种操作:

  • 如果能被3整除,可以整除3

  • 如果能被2整除,可以整除2

  • 可以减1

问至少多少次可以把正整数n变成1


dp代码:

int dp[20000010];
int main()
{
   fill(dp, dp + 20000005, INF);
   dp[1] = 0;
   for (int i = 1; i <= 20000000; i++)
   {
       if (i % 3 == 0)
           dp[i] = min(dp[i], dp[i / 3] + 1);
       if (i % 2 == 0)
           dp[i] = min(dp[i / 2] + 1, dp[i]);
       dp[i] = min(dp[i], dp[i - 1] + 1);
   }
   int t;
   cin >> t;
   int cas = 1;
   while (t--)
   {
       int n;
       cin >> n;
       printf(" Case %d: %d\n", cas++, dp[n]);
   }
   return 0;
}
发布了91 篇原创文章 · 获赞 67 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/hesorchen/article/details/105313904