Algoritmo de programação dinâmica
1. Objetivo
É o processo de resolução do processo de otimização do processo de tomada de decisão.
2. Método
Decompor o problema original em subproblemas para solução é a ideia de dividir para conquistar.
3. Processo
Existem quatro etapas principais:
- Divida os subproblemas: divida um grande problema em pequenos problemas
- Status: como lidar com questões menores.
- Transição de estado: isto é, como o problema dos pais deriva do problema dos filhos.
- Determine o limite: determine qual é o estado inicial? O menor subproblema? Qual é o estado final?
4. Exemplos
(1) Likou: 5. A substring de palíndromo mais longa
class Solution {
public:
string longestPalindrome(string s) {
int length = s.length();
vector<vector<bool>> answer(length, vector<bool>(length));
int Start = 0,End = 0;
//自己与自己的关系全部设为true,也就是只有一个的情况
for(int i = 0;i < length;i++){
answer[i][i] = true;
}
//开始进行遍历,达到条件的就改成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;
}
answer[i][j] = true;
}
}
}
return s.substr(Start,(End - Start + 1));
}
};
ps: Eu encontrei muitos problemas quando estava escrevendo esta parte das perguntas e foi muito difícil fazer isso, infelizmente.
(1) Likou: 1018. Prefixo binário divisível por 5
Por exemplo, [0,1,1,1], o primeiro número é 0, o segundo número é 01, o terceiro é 011 e o quarto é 0111. Convertido em decimal, eles são 0, 1, 3, 7. Então, de acordo com a regra binária, cada vez que os dados se movem um bit para a esquerda, o tamanho dos dados é multiplicado por 2.
Então, você pode usar soma = 0, soma = soma * 2 + num. num é o elemento em [0,1,1,1] e sum é o decimal convertido.
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;
}
};
Então a operação expirou, então vou transformá-la.
Primeiro, podemos transformar soma * 2 em soma << 1, alterá-la diretamente para a posição de movimento binária e, em seguida, fazer a soma igual ao resto deixado pela soma anterior .
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;
}
};
Em seguida, é relatado um erro de que o espaço de armazenamento dos dados do tipo int não é suficiente, então encontre uma maneira de tornar o armazenamento interno menor.
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;
}
};
Cada vez que soma é dividida por 5 para que a soma seja apenas igual ao resto, porque o número extra também é um múltiplo de cinco, a chave é ver como a parte restante dos dados pode ser processada.