1. Goal

It is the process of solving the optimization process of the decision-making process.

2. Method

Decomposing the original problem into sub-problems for solution is the idea of ​​divide and conquer.

3. Process

There are four main steps:

1. Divide sub-problems: break a big problem into small problems
2. Status: How to deal with minor issues.
3. State transition: that is, how the parent problem derives the child problem.
4. Determine the boundary: determine what the initial state is? The smallest sub-problem? What is the final state?

4. Examples

(1) Likou: 5. The longest palindrome substring

``````class Solution {

public:
string longestPalindrome(string s) {

int length = s.length();
int Start = 0,End = 0;
//自己与自己的关系全部设为true，也就是只有一个的情况
for(int i = 0;i < length;i++){

}
//开始进行遍历，达到条件的就改成true
for(int j = 1;j < length;j++){

for(int i = 0;i < j;i++){

if(s.at(i) == s.at(j) &&(i+1 == j || answer[i+1][j-1]))
{

if(j - i >= End - Start){

Start = i;
End = j;
}
}
}
}
return s.substr(Start,(End - Start + 1));
}
};

``````

ps: I encountered a lot of problems when I was writing this part of the questions, and it was very difficult to do it, alas.

(1) Likou: 1018. Binary prefix divisible by 5

For example, [0,1,1,1], the first number is 0, the second number is 01, the third is 011, and the fourth is 0111, converted to decimal, which are 0, 1, 3 , 7. Then according to the binary rule, each time the data moves one bit to the left, the data size is multiplied by 2.
Then you can use sum = 0, sum = sum *2 + num. num is the element in [0,1,1,1], and sum is the converted decimal.

``````class Solution {

public:
vector<bool> prefixesDivBy5(vector<int>& A) {

vector<bool> a;
int sum = 0;
for(auto num : A){

sum = sum * 2 +num;
cout<<sum % 5<<endl;
if(sum % 5 == 0) a.push_back(1);
else if(sum % 5 != 0 ) a.push_back(0);
}
return a;
}
};
``````

Then the operation timed out, so I am going to transform it.
First, we can transform sum*2 into sum<<1, directly change it to the binary moving position, and then make sum equal to the remainder left by the previous sum.

``````class Solution {

public:
vector<bool> prefixesDivBy5(vector<int>& A) {

vector<bool> a;
int sum = 0;
for(auto num : A){

sum = (sum << 1) +num;
a.push_back(sum % 5 == 0);
}
return a;
}
};
``````

Then it reported that the storage space of the int type data is not enough, then find a way to make the int store smaller.

``````class Solution {

public:
vector<bool> prefixesDivBy5(vector<int>& A) {

vector<bool> a;
int sum = 0;
for(auto num : A){

sum = ((sum << 1) +num) %5;
a.push_back(sum == 0);
}
return a;
}
};
``````

Every time sum is divided by 5 so that sum is only equal to his remainder, because the extra number is also a multiple of five, the key is to see how the remaining part of the data can be processed.

Guess you like

Origin blog.csdn.net/weixin_45743162/article/details/110870972
Recommended
Ranking
Daily