私はKadaneのアルゴリズムを以下のように変更して、配列にすべての負の数がある場合でも動作するようにしました。最大サブアレイの要素を印刷するKadaneのアルゴリズムが見つかりましたか?
//Largest Sum Contiguous Subarray
#include <iostream>
#include <map>
#include <vector>
#include <string>
#include <utility>
#include <algorithm>
using namespace std;
#define ll long long
#define pb push_back
#define mp make_pair
#define F(i,a,b) for(int i = (int)(a); i < (int)(b); i++)
#define RF(i,a,b) for(int i = (int)(a); i >= (int)(b); i--)
#define SIZE 100000
int main (void)
{
vector<int> myvec;
int arr[SIZE];
int index[SIZE] = {0};
int n;
cin>>n;
F(i,0,n)
{
cin>>arr[i];
}
int maxendinghere = arr[0];
int maxsofar = arr[0];
F(i,1,n)
{
if (arr[i] > (arr[i]+maxendinghere))
myvec.pb(i); // used for finding the elements of the subarray
maxendinghere = max(arr[i],arr[i]+maxendinghere);
maxsofar = max(maxendinghere,maxsofar);
}
cout<<maxsofar<<"\n";
auto it = myvec.begin(); // printing the subarray
while (it != myvec.end())
{
cout<<*it<<"\t";
it++;
}
cout<<"\n";
return 0;
}
ここで、サブアレイを構成する実際の要素を印刷しようとしています。私が考えることができることの1つは、毎回(arr[i]+maxendinghere)
がarr[i]
より大きくなるということです。新しい要素はサブアレイの一部になり、私はそれをベクトルにプッシュして要素を出力します。しかし、これは実際のサブアレイを正しく出力しません。この考え方の過程で私は何が欠けていますか?ありがとう!
PS:これは最高のコーディングスタイルではないと私は理解していますが、これはインタビューで尋ねられ、コード化しようとしていました。私は当時のことができなかったので、これは私が思いつくことができたものです。
編集:回答)templatypypedefによって与えられた答えの後に私はそれをコード化することができました。フォローは実装です。
//Largest Sum Contiguous Subarray
#include <iostream>
#include <map>
#include <vector>
#include <string>
#include <utility>
#include <algorithm>
using namespace std;
#define ll long long
#define pb push_back
#define mp make_pair
#define F(i,a,b) for(int i = (int)(a); i < (int)(b); i++)
#define RF(i,a,b) for(int i = (int)(a); i >= (int)(b); i--)
#define SIZE 100000
int main (void)
{
int currsum[SIZE],maxsumsofar[SIZE],sindex[SIZE],eindex[SIZE];
int arr[SIZE];
int start,end,n;
cin>>n;
F(i,0,n)
{
cin>>arr[i];
}
currsum[0] = arr[0];
maxsumsofar[0] = arr[0];
sindex[0] = 0;
eindex[0] = 0;
F(i,1,n)
{
if (arr[i] > (arr[i]+currsum[i-1])) // for starting index
sindex[i] = i;
else
sindex[i] = sindex[i-1];
currsum[i] = max(arr[i],arr[i]+currsum[i-1]);
maxsumsofar[i] = max(currsum[i],maxsumsofar[i-1]);
if (arr[i] > (arr[i]+currsum[i-1]))
eindex[i] = i;
else
{
if (maxsumsofar[i] == maxsumsofar[i-1])
eindex[i] = eindex[i-1];
else
eindex[i] = i;
}
}
cout<<maxsumsofar[n-1]<<"\n";
F(i,0,n)
{
if (maxsumsofar[i] == maxsumsofar[n-1])
{
start = sindex[i];
end = eindex[i];
break;
}
}
cout<<"The array lies between indices "<<start<<" to "<<end<<"\n";
return 0;
}
私はインタビューでそのようなコードを書くことに非常に注意しています - それは非常に読みにくいです。 – templatetypedef
@templatetypedef、私は理解しています。より意味のある変数名を取って、可能な限り記述的にする(プリプロセッサの使用を避ける)べきです。それは、私が家に帰ったときに、私は自分自身で質問をしようとしました。そのために、それを動作させるようにコード化しました。 –