zoukankan      html  css  js  c++  java
  • leetcode 343 整数拆分

    1.这个题拿到之后没有什么思路,此时就应该考虑暴力法。然而每次不知道要拆成几份,没办法用循环,所以想到用递归。

    如图所示进行递归,显然有很多重复的计算,所以用自底向上的动态规划。

    2.还有一个问题就是memo[i]是如果拆开i的话的最大值,有些数字比如5=2+3,2*3=6>5,这种数字memo[i]>i,拆开更好,但有的数拆开要比原来的数小,所以要进行判断,选择最大的数字。还要注意一点是至少要拆成两个数字。

    #include <bits/stdc++.h>
    using namespace std;
    class Solution {
    public:
        int integerBreak(int n) {
            vector<int>memo(n+1, 0);
            memo[1] = 1;
            memo[2]=1;
            int i, j;
            int max;
            for (i = 3; i <= n; i++)
            {
                max=0;
                for (j = 1; j <=(i-1); j++)
                {
                    if((memo[j]>(j)?memo[j]:j)*(memo[i-j]>(i-j)?memo[i-j]:i-j)>max)
                        max=(memo[j]>(j)?memo[j]:j)*(memo[i-j]>(i-j)?memo[i-j]:i-j);
                }
                memo[i]=max;
            }
            return memo[n];
        }
    };
  • 相关阅读:
    vim 多文件操作
    二分查找
    单调栈
    常见TCP问题
    C++为啥引入nullptr?
    python处理表格按照表头为单位的划分并分割到单独的文件
    集合:List,Set,Map
    SpringBoot
    Spring框架
    JavaScript 类型、原型与继承学习笔记
  • 原文地址:https://www.cnblogs.com/legendcong/p/9141977.html
Copyright © 2011-2022 走看看