ভূমিকা
মনে করুন আপনি এবং আপনার বন্ধু একটি খেলা খেলছেন। আপনার বন্ধু nবিটের কিছু নির্দিষ্ট ক্রম সম্পর্কে ভাবেন এবং আপনার কাজটি তাদের প্রশ্ন জিজ্ঞাসা করে ক্রমটি হ্রাস করা। তবে, আপনাকে কেবলমাত্র এক ধরণের প্রশ্ন জিজ্ঞাসা করার অনুমতি দেওয়া হ'ল "আপনার সিকোয়েন্সের দীর্ঘতম সাধারণ অনুচ্ছেদটি কত দীর্ঘ এবং S", যেখানে Sবিটের কোনও অনুক্রম রয়েছে। আপনার যত কম প্রশ্ন দরকার, তত ভাল।
কাজটি
আপনার কাজ হ'ল একটি প্রোগ্রাম বা ফাংশন লিখুন যা ইনপুট হিসাবে ধনাত্মক পূর্ণসংখ্যার nএবং Rদৈর্ঘ্যের একটি বাইনারি ক্রম নেয় n। ক্রমটি পূর্ণসংখ্যার অ্যারে, স্ট্রিং বা আপনার পছন্দ মতো কিছু যুক্তিসঙ্গত ধরণের হতে পারে। আপনার প্রোগ্রাম ক্রম আউটপুট হবে R।
তোমার প্রোগ্রাম হয় না ক্রম অ্যাক্সেসের অনুমতি Rসরাসরি। শুধুমাত্র জিনিস এটি করতে অনুমোদিত Rফাংশনে ইনপুট যেমন দিতে হয় len_lcsঅন্য বাইনারি ক্রম সহ S। ফাংশন len_lcs(R, S)দীর্ঘতম সাধারণ subsequence দৈর্ঘ্য ফেরৎ Rএবং S। এর অর্থ বিটের দীর্ঘতম ক্রম যা উভয় Rএবং এর মধ্যে একটি (অগত্যা সংগত নয়) উপসংশ হিসাবে ঘটে S। যার ইনপুটগুলি len_lcsবিভিন্ন দৈর্ঘ্যের হতে পারে। প্রোগ্রামটি এই ফাংশনটি Rএবং অন্যান্য সিকোয়েন্সগুলি কয়েকবার কল করে এবং তারপরে Rসেই তথ্যের উপর ভিত্তি করে ক্রমটি পুনর্গঠন করে ।
উদাহরণ
ইনপুট n = 4এবং বিবেচনা করুন R = "1010"। প্রথমত, আমরা মূল্যায়ন পারে len_lcs(R, "110"), যা দেয় 3, যেহেতু "110"দীর্ঘতম সাধারণ subsequence হয় "1010"এবং "110"। তারপরে আমরা জানি যে কিছু অবস্থানে একটি বিট byোকানো দ্বারা Rপ্রাপ্ত করা হয়েছে "110"। এর পরে, আমরা চেষ্টা করতে পারি len_lcs(R, "0110"), যেটি 3সবচেয়ে দীর্ঘকালীন সাধারণ অনুচ্ছেদগুলি যেহেতু ফিরে আসে "110"এবং "010"তাই "0110"সঠিক নয়। তারপরে আমরা চেষ্টা করি len_lcs(R, "1010"), যা ফিরে আসে 4। এখন আমরা এটি জানি R == "1010", সুতরাং আমরা সেই অনুক্রমটিকে সঠিক আউটপুট হিসাবে ফিরিয়ে দিতে পারি। এটিতে 3 টি কল প্রয়োজন len_lcs।
বিধি এবং স্কোরিং
ইন এই সংগ্রহস্থলের , আপনি নামক একটি ফাইল পাবেন subsequence_data.txt75 এবং 124. মধ্যে লেন্থ 100 র্যান্ডম বাইনারি সিকোয়েন্স তারা 0 এবং 1 এর মধ্যে তিনটি র্যান্ডম ভাসে গ্রহণ হিসেবে তাদের গড় গ্রহণ করে উত্পন্ন হয় ধারণকারী a, এবং তারপর আলোকসম্পাতের একটি a-biased মুদ্রা nবার। আপনি এই স্কোরগুলিতে কল করার গড় সংখ্যাlen_lcs হ'ল কম স্কোর আরও ভাল। আপনার জমা দেওয়ার ক্ষেত্রে কলগুলির সংখ্যা রেকর্ড করা উচিত। কোনও সময়সীমা নেই, কেবলমাত্র আপনার প্রোগ্রামটি জমা দেওয়ার আগে ফাইলটিতে চালানো উচিত।
আপনার জমাটি সংজ্ঞাবহ হতে হবে। PRNGs অনুমোদিত, কিন্তু তাদের অবশ্যই আজকের তারিখটি 200116(বা নিকটতম সমতুল্য) এলোমেলো বীজ হিসাবে ব্যবহার করতে হবে। এই নির্দিষ্ট পরীক্ষার ক্ষেত্রে আপনার জমাটি অপ্টিমাইজ করার অনুমতি নেই। যদি সন্দেহ হয় যে এটি ঘটছে তবে আমি একটি নতুন ব্যাচ তৈরি করব।
এটি কোড গল্ফ নয়, তাই আপনাকে পঠনযোগ্য কোড লেখার জন্য উত্সাহ দেওয়া হচ্ছে। রোজটা কোডের দীর্ঘতম সাধারণ অনুচ্ছেদে একটি পৃষ্ঠা রয়েছে ; আপনি len_lcsএটি আপনার পছন্দসই ভাষায় প্রয়োগ করতে পারেন ।
lcsপরিবর্তে অ্যাক্সেস করতে পারেন তা মনে হয় len_lcs।
lcs(R, "01"*2*n)রিটার্নের পর থেকে এটি খুব আকর্ষণীয় হবে না R। ;) তবে এটি কাজ করতে পারে যদি কল করা 1 এর পরিবর্তে lcs(R, S)স্কোর len(S)বা আরও কিছু বাড়িয়ে দেয় ...