ডাইনামিক প্রোগ্রামিং কৌশলগুলি ব্যবহার করে কীভাবে "পিজা বাছাই সমস্যা" সমাধান করা হয়?


9

উইঙ্কলারের পিজ্জা বাছাইয়ের সমস্যা:

  • nটুকরোগুলির একটি বৃত্তাকার পিজ্জা পাই , যেখানে স্লাইসের iক্ষেত্রফল রয়েছে S_i, প্রতিটি পাই অংশের জন্য এলাকাটি আলাদা is
  • ইটারস অ্যালিস এবং বব বাছাইকারী টুকরাগুলি নেবে, তবে পাইতে একাধিক ফাঁক তৈরি করা অভদ্র (এটি অনুমোদিত নয় বিবেচনা করুন)।
    • সুতরাং প্রতিটি ভোক্তা খোলা অঞ্চল সংলগ্ন দুটি ফালিগুলির মধ্যে একটিতে সীমাবদ্ধ। অ্যালিস প্রথমে যায়, এবং উভয়ই খাওয়াদাওয়া যতটা সম্ভব পাইয়ের সন্ধান করে।

গতিশীল প্রোগ্রামিং অ্যালগরিদম কীভাবে নির্ধারণ করতে পারে যে অ্যালিস এবং বব উভয়ই পিজ্জা সেবাকে সর্বাধিকতর করতে পুরোপুরি খেললে অ্যালিস কত পাই খায়?

আমার বোঝার:

একটি সাধারণ ডিপি সমস্যায় আমরা উপ-সমস্যাগুলি সন্ধানের সাথে এগিয়ে চলেছি যা পুনরাবৃত্তি গাছ ব্যবহার করে বা আরও শক্তভাবে একটি ডিএজি ব্যবহার করে ভিজ্যুয়ালাইজ করা যায়। এখানে, আমি এখানে উপ-সমস্যাগুলি সন্ধানের জন্য কোনও নেতৃত্ব খুঁজে পাচ্ছি না।

এখানে, এস_আই এস এর প্রদত্ত সংকলনের জন্য আমাদের অ্যালিসের খাওয়ার টুকরাগুলির ক্ষেত্র সর্বাধিক করা দরকার। এটি নির্ভর করবে (এন -1) এর বাইরে পিজ্জার টুকরোগুলির অনুমতি ছাড়াই। প্রতি এন \ 2 টার্নে দুটি বিকল্প উপলভ্য দুটি বিকল্পের মধ্যে একটি সর্বাধিক অঞ্চল স্লাইস নির্বাচন করা অ্যালিসকে পায়, আমাদের ক্রম ছাড়ার জন্য স্লাইসের মোট ক্ষেত্রটি দেবে। এ জাতীয় সমস্ত ক্রয়ের জন্য আমাদের স্লাইসের ক্ষেত্র সন্ধান করতে হবে। এবং তারপরে এগুলির সর্বাধিক।

কেউ কীভাবে আমাকে এগিয়ে যেতে সাহায্য করতে পারে?

উত্তর:


5

স্রেফ স্রেফ রেখে দেওয়া টুকরোগুলি বিবেচনা করে শুরু করুন এবং আপনি দুটি প্রান্তের একটি থেকে বেছে নিতে পারেন। এই ক্ষেত্রে ত এটা আপনার পালা এটা পরিষ্কার যে বেছে নিতে আগ্রহী pizzaAmount(slices)হয়

  1. যদি পিজ্জা না থাকে তবে ফলাফল 0 হয়
  2. যদি কেবলমাত্র একটি স্লাইস ফলাফল হয় তবে সেই স্লাইস
  3. যদি কমপক্ষে দুটি টুকরো থাকে তবে ফলাফলটি হ'ল:

(পাইথন সিনট্যাক্স ব্যবহার করে)

max(slices[0] + sum(slices[1:]) - pizzaAmount(slices[1:]),
    slices[-1] + sum(slices[:-1]) - pizzaAmount(slices[:-1]))

অন্য কথায় আপনার উভয় বিকল্প বিবেচনা করা উচিত এবং আপনার স্লাইস নেওয়ার পরে আপনি পুনরাবৃত্ত কলের ফলাফল বাদে বাকী সমস্ত পিজ্জা পাবেন (কারণ আপনার বন্ধুটি একই কৌশল ব্যবহার করবে)।

আপনি এটিকে ডিপি (বা মেমোজাইজিং) এর মাধ্যমে বাস্তবায়ন করতে পারেন কারণ অ্যারেটি প্রকৃতপক্ষে স্থির হয়ে গেছে এবং আপনি প্রথম এবং শেষ স্লাইস সূচকটিকে পরামিতি হিসাবে বিবেচনা করতে পারেন।

মূল সম্পূর্ণ সমস্যা সমাধানের জন্য আপনাকে কেবল স্লাইস শুরু হিসাবে সমস্ত স্লাইস চেষ্টা করে দেখতে হবে এবং ফলাফলটি সর্বাধিকীকরণ করা একটিকে বেছে নিতে হবে।


ধন্যবাদ "6502"। "সবেমাত্র রাখা স্লাইসগুলি বিবেচনা করে এবং দুটি প্রান্তের মধ্যে একটি থেকে বাছাই করা" এর ইঙ্গিতটি ব্যবহার করে আমি সমস্যাটি আরও ভালভাবে কল্পনা করতে পারি। প্রদত্ত পুনরাবৃত্তির সম্পর্কটি প্রতিপক্ষের সর্বোত্তম পছন্দটিও গ্রহণ করছে। আমি শীঘ্রই একটি আনুষ্ঠানিক অ্যালগরিদম পোস্ট করব। ধন্যবাদ বন্ধুরা!!

শুধু কৌতূহল, এই অ্যালগরিদমের জটিলতার ক্রম কী? 0 (n * 2 ^ n)?

@ অ্যাক্রন: এটি গতিশীল প্রোগ্রামিং পদ্ধতির বা স্মৃতিচারণ ছাড়াই হবে। তবে আপনি এই সিদ্ধান্তটি গ্রহণ করতে পারেন যে ফলাফলটি pizzaAmountকেবলমাত্র অন্যান্য টুকরোগুলির সূচনা এবং থামার সূচকগুলি নির্ভর করে এবং আপনার এবং আপনার বন্ধু ইতিমধ্যে যে পিজ্জা টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো করে খেয়েছে তার ফলাফলের উপর নির্ভর করে আপনি ফলাফলটি সংরক্ষণ করতে পারবেন পুনর্নির্মাণ এড়াতে ম্যাট্রিক্স। অ্যালগরিদমের ক্রম তাই ও (এন ** 2)।
6502

কেউ যদি এখনও বুঝতে চেষ্টা করে তবে এই লিঙ্কটির খুব সুন্দর ব্যাখ্যা রয়েছে।
অমিত শেখর

3

পিৎজার অংশের জন্য F(i,j)সর্বাধিক নির্ধারণ করুন যে প্রথম ব্যক্তি যে স্লাইসটি খায় সে কতটা খেতে পারে। পিজ্জার অংশের টুকরোগুলি হ'ল (i,j):

if i <= j than slices i, i+1, ..., j-1, j
if i > j than slices i, i+1, ..., n-1, n, 1, 2, ..., j-1, j
and we don't define it for whole pizza, abs(i-j) < n-1

হিসাবে নির্ধারণ R(i,j)(দ্বিতীয় ব্যক্তির জন্য কতটুকু বাকি) sum(S_x, x in slices(i,j)) - F(i,j)

সঙ্গে:

F(i,i) = S_i,
F(i,j) = max( S_i + R(i+1,j), S_j + R(i,j-1) ),

অ্যালিস যে সর্বাধিক খেতে পারে তা গণনা করা হয়:

max( S_i + F(i+1, (i-1) if i > 1 else n) ).
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.