को देखते हुए एन कार्ड प्राप्त करने के लिए करता है, तो ith कार्ड अपने सामने की ओर संख्या एक्स है तो यह पीछे की ओर -x और एक ही आपरेशन है कि केवल कि कार्ड के किसी भी संख्या फ्लिप करने के लिए है एक बार किया जा सकता है होगा जहां केवल एक बार लगातार आदेश में।फ्लिप कार्ड अधिकतम राशि
अब हम इस तरह से ताश के पत्तों की ऊपरी चेहरे की संख्या की उस राशि अधिकतम है में कार्ड फ्लिप करने की जरूरत है।
उदाहरण: यदि एन = 5 और कार्ड [] हो {-2,3, -1, -4, -2} तो यहाँ जवाब 8 के रूप में हम पिछले 3 कार्ड फ्लिप विन्यास प्राप्त करने के लिए कर सकते हैं {-2,3 , 1,4,2} 8.
लिए जो राशि मेरे दृष्टिकोण:
प्रारंभ स्थिति के रूप में प्रत्येक ith पद के लिए प्रत्येक संभव तरीके के लिए जाओ और पाते हैं maximum.But इस समस्या के लिए अपने किसी भी बेहतर समाधान है?
मेरे कोड: अभी तक
#include<bits/stdc++.h>
using namespace std;
int solve(std::vector<int> const & numbers)
{
int min_so_far = numbers[0], min_ending_here = numbers[0];
size_t begin = 0;
size_t begin_temp = 0;
size_t end = 0;
for(size_t i = 1; i < numbers.size(); i++)
{
if(min_ending_here > 0)
{
min_ending_here = numbers[i];
begin_temp = i;
}
else
{
min_ending_here += numbers[i];
}
if(min_ending_here <= min_so_far)
{
min_so_far = min_ending_here;
begin = begin_temp;
end = i;
}
}
int sum=0;
for(int i=0;i<begin;i++){
sum+=numbers[i];
}
for(int i=begin;i<=end;i++){
sum-=numbers[i];
}
for(int i=end+1;i<numbers.size();i++){
sum+=numbers[i];
}
return sum;
}
int main(){
int n;
cin>>n;
vector<int> arr;
for(int i=0;i<n;i++){
int x;
cin>>x;
arr.push_back(x);
}
cout<<solve(arr)<<"\n";
}
@VotetoClose यह एक एल्गोरिथम प्रश्न गणित के साथ कुछ नहीं किया है: अधिक से अधिक, यह गणित के लिए कुछ जोखिम की आवश्यकता है। – dasblinkenlight
यदि आप अपने सरणी को सकारात्मक और नकारात्मक खंडों में विभाजित करते हैं तो आपको वास्तव में केवल नकारात्मक खंड के अंत तक, प्रत्येक नकारात्मक खंड की शुरुआत का परीक्षण करने की आवश्यकता होती है। – Ben
@ बेन वास्तव में नहीं: '-3, 2, -4' का उत्तर 5 है (सबकुछ फ़्लिप करें), इसलिए आप पहले नकारात्मक खंड के अंत में फ़्लिपिंग नहीं रोक सकते हैं। – dasblinkenlight