DAExer4.pdf

‫))ﺑﻪ ﻧﺎم ﺧﺪاوﻧﺪ ﺑﺨﺸﻨﺪه ي ﻣﻬﺮﺑﺎن ((‬
‫ﺗﻤﺮﻳﻦ ﺷﻤﺎره ي‪- 4‬درس ﻃﺮاﺣﻲ اﻟﮕﻮرﻳﺘﻤﻬﺎ‬
‫ﻣﻬﻠﺖ ﺗﺤﻮﻳﻞ ﺗﻤﺮﻳﻦ ‪ 1387/3/ 5:‬ﺳﺎﻋﺖ ‪23:59‬‬
‫) ‪(Dynamic Programming‬‬
‫ﻣﻼﺣﻈﺎت ‪:‬‬
‫ اﻳﻦ ﺗﻤﺮﻳﻦ ﻫﻢ داراي ﻗﺴﻤﺘﻬﺎي ﺗﺌﻮري و ﻫﻢ ﻋﻤﻠﻲ اﺳﺖ‪ .‬ﭘﺎﺳﺦ ﻗﺴﻤﺘﻬﺎي ﺗﺌﻮري و ﻋﻤﻠﻲ را در ﻗﺎﻟﺐ ﻳﻚ ﻓﺎﻳﻞ ﻓﺸﺮده ﺑﻪ ﻧﺎم‬‫‪ Ex4-yourID.zip‬ﺑﻪ آدرس ‪ [email protected]‬ﻣﻴﻞ ﻛﻨﻴﺪ‪ .‬ﻋﻨﻮان ﭘﺴﺖ اﻟﻜﺘﺮوﻧﻴﻜﻲ ﻧﻴﺰ ‪ Ex4-yourID‬ﺑﺎﻳﺪ ﺑﺎﺷﺪ‪.‬‬
‫ ﺑﻪ ﻫﻴﭻ وﺟﻪ ﻛﺎر ﻫﺎي ﻏﻴﺮ اﺧﻼﻗﻲ ﻣﺜﻞ روﻧﻮﻳﺴﻲ و ﻛﭙﻲ ﺑﺮﻧﺎﻣﻪ ي دﻳﮕﺮان و ‪ ....‬ﭘﺬﻳﺮﻓﺘﻪ ﻧﻴﺴﺖ‪ .‬درﺻﻮرت ﻣﺸﺎﻫﺪه ﻧﻤﺮه ي ﺷﻤﺎ ‪ -100‬در ﻧﻈﺮ‬‫ﮔﺮﻓﺘﻪ ﻣﻲ ﺷﻮد‪) .‬اﮔﺮ ﺗﻤﺮﻳﻨﺎت را ﺑﺎ ﻫﻢ ﻣﻲ ﻧﻮﻳﺴﻴﺪ ﺳﻌﻲ ﻛﻨﻴﺪ ﻃﺮﻳﻖ ﻧﻮﺷﺘﻦ ﺷﻤﺎ ﻣﺎﻧﻨﺪ ﻳﻜﺪﻳﮕﺮ ﻧﺒﺎﺷﺪ‪ .‬ﭼﻮن در ﺻﻮرت ﻣﺸﺎﺑﻬﺖ ﺑﺎ وﺟﻮد ﺑﻲ‬
‫ﮔﻨﺎﻫﻲ‪ ،‬ﮔﻨﺎﻫﻜﺎر ﺷﻨﺎﺧﺘﻪ ﺧﻮاﻫﻴﺪ ﺷﺪ و ﻧﻤﺮه ي ﺧﻮد را از دﺳﺖ ﺧﻮاﻫﻴﺪ داد(‬
‫ ﺑﻪ ﻫﻴﭻ وﺟﻪ زﻣﺎن ﺗﺤﻮﻳﻞ اﻳﻦ ﺗﻤﺮﻳﻦ ﺗﻤﺪﻳﺪ ﻧﻤﻲ ﺷﻮد‪ .‬ﺑﻪ ازاي ﻫﺮﺳﺎﻋﺖ ﺗﺎﺧﻴﺮ‪ 20‬ﻧﻤﺮه )از ‪ 100‬ﻧﻤﺮه( را از دﺳﺖ ﻣﻲ دﻫﻴﺪ‪.‬‬‫‪ -‬ﻫﺮ ﮔﻮﻧﻪ ﺳﻮال و ﻣﺸﻜﻠﻲ و ﻳﺎ اﻳﺮادي را ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺎ ‪ [email protected]‬در ﻣﻴﺎن ﺑﮕﺬارﻳﺪ‪.‬‬
‫‪ -1‬ﺑﻠﻨﺪﺗﺮﻳﻦ ﭘﻴﺸﻮﻧﺪ‬
‫☻ﺗﻌﺮﻳﻒ ‪ : 1‬ﺑﻪ ﻛﺎراﻛﺘﺮ ﻫﺎي اول ﺗﺎ ‪ k‬ام ﻳﻚ رﺷﺘﻪ ﭘﻴﺸﻮﻧﺪ ‪ k‬ام آن رﺷﺘﻪ ﻣﻲﮔﻮﻳﻴﻢ‪.‬‬
‫ﺗﻌﺮﻳﻒ ‪ : 2‬ﻣﻲﮔﻮﻳﻴﻢ ﻳﻚ رﺷﺘﻪ از روي ﻳﻚ ﺳﺮي رﺷﺘﻪي ﭘﺎﻳﻪ ﻗﺎﺑﻞ ﺳﺎﺧﺖ اﺳﺖ اﮔﺮ و ﻓﻘﻂ اﮔﺮ ﺑﺘﻮان ﺑﺎ اﺗﺼﺎل)‪ (concatenation‬ﺗﻌﺪادي‬
‫ازاﻳﻦ رﺷﺘﻪ ﻫﺎي ﭘﺎﻳﻪ ﺑﻪ آن رﺷﺘﻪ رﺳﻴﺪ‪.‬‬
‫در ﻓﺎﻳﻞ ورودي ﺑﻪ ﻧﺎم ‪ prefix.in‬ﺗﻌﺪادي رﺷﺘﻪي ﭘﺎﻳﻪ )ﺣﺪاﻛﻨﺮ ‪ 200‬ﺗﺎ( و ﻫﺮ ﻛﺪام ﺑﻪ ﻃﻮل ﺣﺪاﻛﺜﺮ ‪ 10‬ﻛﺎراﻛﺘﺮ ﻧﻮﺷﺘﻪ ﺷﺪه اﺳﺖ ﻛﻪ ﻓﻘﻂ از‬
‫ﺣﺮوف ﺑﺰرگ اﻧﮕﻠﻴﺴﻲ ﺗﺸﻜﻴﻞ ﺷﺪه اﻧﺪ و ﺑﺎ ﻛﺎراﻛﺘﺮ ﻫﺎي ﻓﺎﺻﻠﻪ)"‪ "\n‬و " "و "‪"\t‬و‪ (...‬از ﻫﻢ ﺟﺪا ﮔﺮدﻳﺪه اﻧﺪ‪ .‬ﺑﻌﺪ از آن در اﻳﻦ ﻓﺎﻳﻞ ﻳﻚ‬
‫ﻛﺎراﻛﺘﺮ "‪ ".‬و ﺑﻌﺪ از آن ﻳﻚ رﺷﺘﻪ ي ﻫﺪف ﺑﺎ ﻃﻮل ﺣﺪاﻛﺜﺮ ‪ 200000‬و ﺗﺸﻜﻴﻞ ﺷﺪه ﺗﻨﻬﺎ از ﺣﺮوف ﺑﺰرگ اﻧﮕﻠﻴﺴﻲ ﻧﻮﺷﺘﻪ ﺷﺪه اﺳﺖ‪ .‬ﺑﻪ ﻋﻨﻮان‬
‫ﻣﺜﺎل ورودي زﻳﺮ را ﺑﺒﻴﻨﻴﺪ‪:‬‬
‫ﺑﺮﻧﺎﻣﻪ اي ﺑﻨﻮﻳﺴﻴﺪ )در ﻓﺎﻳﻞ ‪ prefix.cpp‬ﻳﺎ ‪ (prefix.java‬ﻛﻪ اﻳﻦ ﻓﺎﻳﻞ ورودي را درﻳﺎﻓﺖ ﻛﻨﺪ ‪ .‬ﺑﺰرﮔﺘﺮﻳﻦ ﻋﺪد ‪ k‬را ﭘﻴﺪا ﻛﻨﺪ ﻛﻪ ﭘﻴﺸﻮﻧﺪ‬
‫‪ k‬ام رﺷﺘﻪ ي ﻫﺪف ﺗﻮﺳﻂ رﺷﺘﻪ ﻫﺎي ﭘﺎﻳﻪ ﻗﺎﺑﻞ ﺳﺎﺧﺖ ﺑﺎﺷﺪ ‪ .‬ﺳﭙﺲ اﻳﻦ ﻋﺪد ‪ k‬را در ﻓﺎﻳﻞ ﺧﺮوﺟﻲ ‪ prefix.out‬ﺑﻨﻮﻳﺴﺪ‪ .‬ﻣﺜﺎل ﺧﺮوﺟﻲ ﺑﺮاي‬
‫ﻓﺎﻳﻞ ﺧﺮوﺟﻲ ﺑﻪ ازاي ورودي ﺑﺎﻻ را ﺑﺒﻨﻴﻨﺪ ‪:‬‬
‫‪ -2‬ﻛﻤﺘﺮﻳﻦ اﺧﺘﻼف‬
‫☺ ﻣﻲ ﺧﻮاﻫﻴﻢ ﻳﻚ ﻣﺠﻤﻮﻋﻪ ي ‪ n‬ﻋﻀﻮي را ﻃﻮري ﺑﻪ دو ﻗﺴﻤﺖ اﻓﺮاز ﻛﻨﻴﻢ ﻛﻪ اﺧﺘﻼف ‪ 2‬ﻣﺠﻤﻮع اﻋﻀﺎي دو ﻣﺠﻤﻮﻋﻪ ﻛﻤﻴﻨﻪ ﺷﻮد‪ .‬ﻳﻚ‬
‫اﻟﮕﻮرﻳﺘﻢ ﺳﺮﻳﻊ ﺑﺮاي اﻳﻦ ﻛﺎر اراﺋﻪ دﻫﻴﺪ‪) .‬ﻓﺮض ﻛﻨﻴﺪ ﻫﺮ ﻋﺪد از ‪ k‬ﻛﻤﺘﺮ اﺳﺖ‪ .‬ﻣﺮﺗﺒﻪ ي اﻟﮕﻮرﻳﺘﻢ ﺑﻪ ‪ k‬واﺑﺴﺘﻪ ﺧﻮاﻫﺪ ﺑﻮد(‬
‫‪ -3‬دﻧﺒﺎﻟﻪ ي دو ﺗُﻨﻪ ؟!!!‬
‫☺ ﻣﻲ ﺧﻮاﻫﻴﻢ ﺑﺰرﮔﺘﺮﻳﻦ زﻳﺮدﻧﺒﺎﻟﻪ ي دو ﺗُﻨﻪ ي ﻳﻚ دﻧﺒﺎﻟﻪي ‪ n‬ﺗﺎﻳﻲ از اﻋﺪاد را ﺑﻴﺎﺑﻴﻢ‪ .‬زﻳﺮ دﻧﺒﺎﻟﻪ ي دوﺗﻨﻪ دﻧﺒﺎﻟﻪ اي اﺳﺖ ﻛﻪ اﺑﺘﺪا‬
‫ﺻﻌﻮدي و ﺑﻌﺪ ﻧﺰوﻟﻲ ﺑﺎﺷﺪ‪ .‬ﻣﺜﻼ دﻧﺒﺎﻟﻪ ي ‪ 2 3 8 4 1‬ﻳﻚ دﻧﺒﺎﻟﻪ ي دو ﺗﻨﻪ اﺳﺖ‪ .‬ﻳﻚ اﻟﮕﻮرﻳﺘﻢ از ))‪ o(nlog(n‬ﺑﺮاي اﻳﻦ ﻛﺎر‬
‫اراﺋﻪ دﻫﻴﺪ‪.‬‬
‫‪٢‬‬