動的計画法アルゴリズム
1.目標
これは、意思決定プロセスの最適化プロセスを解決するプロセスです。
2.方法
元の問題を解決のためのサブ問題に分解することは、分割統治のアイデアです。
3.プロセス
4つの主要なステップがあります:
- サブ問題を分割する:大きな問題を小さな問題に分割する
- ステータス:マイナーな問題に対処する方法。
- 状態遷移:つまり、親の問題が子の問題をどのように導き出すか。
- 境界を決定します:初期状態が何であるかを決定しますか?最小のサブ問題?最終的な状態は何ですか?
4.例
(1)Likou:5。最長の回文部分文字列
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:質問のこの部分を書いているときに多くの問題に遭遇しましたが、残念ながらそれを行うのは非常に困難でした。
(1)Likou:1018。5で割り切れる2進接頭辞
たとえば、[0,1,1,1]の場合、最初の数値は0、2番目の数値は01、3番目の数値は011、4番目の数値は0111です。10進数に変換すると、0、1、3、7になります。次に、バイナリルールに従って、データが1ビット左に移動するたびに、データサイズに2が乗算されます。
次に、sum = 0、sum = sum * 2 + numを使用できます。numは[0,1,1,1]の要素であり、sumは変換された10進数です。
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;
}
};
その後、演算がタイムアウトしたので、変換します。
まず、sum * 2をsum << 1に変換し、直接バイナリ移動位置に変更してから、sumを前の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;
}
};
次に、int型データのストレージスペースが十分でないというエラーが報告され、intストレージを小さくする方法を見つけます。
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;
}
};
合計が5で除算されるたびに、合計は余りに等しくなります。余分な数も5の倍数であるため、重要なのは、データの残りの部分をどのように処理できるかを確認することです。