मैं निम्नलिखित प्रश्न हल करने के लिए कोशिश कर रहा हूँ:सबसे लंबे समय तक किसी परिणाम है कि पहले बढ़ जाती है तो कम हो जाती है
एक अनुक्रम जिसमें तत्वों पहले कमी के मूल्य में और फिर वृद्धि अनुक्रम कहा जाता है वी। वैध वी-अनुक्रम में घटती हुई कम से कम एक तत्व कम होने और कम से कम एक तत्व होना चाहिए।
उदाहरण के लिए, "5 3 1 9 17 23" एक मान्य वी-अनुक्रम है जिसमें कम से कम 5 और 3, और बढ़ती भुजा में 9 तत्व 17, 17 और 23 में दो तत्व हैं। लेकिन अनुक्रम "6 4 2" या "8 10 15" अनुक्रम में से कोई भी नहीं है क्योंकि "6 4 2" में बढ़ते हिस्से में कोई तत्व नहीं है जबकि "8 10 15" में घटते हिस्से में कोई तत्व नहीं है।
अनुक्रम से शून्य या अधिक तत्वों को हटाकर अनुक्रम का उप-अनुक्रम प्राप्त किया जाता है। उदाहरण के लिए परिभाषा "7", "2 10", "8 2 7 6", "8 2 7 10 6" आदि "8 2 7 10 6"
के अनुक्रमिक उप-अनुक्रम हैं एन संख्याओं के अनुक्रम को देखते हुए अपने सबसे लंबे उप अनुक्रम को खोजें जो एक वी-अनुक्रम है।
मैं वर्तमान में एक O (n^2) समाधान जिसमें मैं पहली बार एक सरणी (एम []) इस तरह के प्रारंभ है कि प्रत्येक मीटर [i] में 'i' सरणी के भीतर शुरूआती सबसे लंबे समय तक बढ़ती दृश्यों शामिल है।
इसी तरह, मैं एक और सरणी (डी []) शुरू करता हूं, जैसे कि प्रत्येक डी [i] उस बिंदु पर सबसे लंबे समय तक घटने वाला अनुक्रम होता है।
इन आपरेशनों केदोनों O (n^2)
मैं अब इन सरणियों के माध्यम से जाने के लिए और मीटर की अधिकतम मूल्य चुनें ले [i] + d [i] -1, आवश्यक शर्तों संतुष्ट हैं ऐसा है कि।
मैं क्या जानना चाहता हूं - क्या कोई ओ (एन एलजी एन) समाधान है ?? क्योंकि मेरा समाधान आवश्यक समय सीमा के भीतर नहीं चलता है। आप :) धन्यवाद
कोड:
#include<cstdio>
#include<algorithm>
using namespace std;
int m[ 200000 ];
int d[200000 ];
int n;
int arr[200000 ];
void LIS()
{
m[ n-1 ] = 1;
int maxvPos = -1;
int maxv = -1;
for(int i=n-2; i>=0; i--)
{
maxv = -1;
for(int j=i+1; j<n; j++)
{
if((m[j]+1 > maxv) && (arr[i] < arr[j]))
{
maxv = m[j]+1;
maxvPos = j;
}
}
if(maxv>0)
{
m[i] = maxv;
}
else
m[i ] = 1;
}
}
void LDS()
{
d[0] = 1;
int maxv = -1;
int maxvPos = -1;
for(int i=1; i<n; i++)
{
maxv = -1;
for(int j=i-1; j>=0; j--)
{
if((d[j]+1 > maxv) && arr[j]>arr[i])
{
maxv = d[j]+1;
maxvPos = j;
}
}
if(maxv>0)
d[i] = maxv;
else
d[i]=1;
}
}
int solve()
{
LIS();
LDS();
int maxv = 0;
int curr = 0;
for(int i=0; i<n; i++)
{
curr = d[i] + m[i] -1 ;
if((d[i]>0) && (m[i]>0))
{
if(curr != 1)
maxv = max(curr, maxv);
}
}
return maxv;
}
/* static void printArr(int[] a)
{
for(int i : a)
System.out.print(i + " ");
System.out.println();
} */
int main()
{
scanf("%d", &n);
for(int i=0; i<n; i++)
{
scanf("%d", &arr[i]);
}
printf("%d\n", solve());
return 0;
}
यह एक प्रोग्रामिंग प्रतियोगिता है कि कल रात हुई से है। मेरे सबमिशन 11 परीक्षण मामलों में से 6 के लिए समय सीमा समाप्त हो गया। – arya