logo

Dinamik dasturlash usuli bilan yechiladigan masalalar

Yuklangan vaqt:

12.08.2023

Ko'chirishlar soni:

0

Hajmi:

117.083984375 KB
“Dinamik dasturlash usuli bilan yechiladigan masalalar”
Mundarija
Kirish ………………………………………………………………… .. …3
I.BOB. NAZARIY QISM ……………………………………….……….4
        1.1 Dinamik dasturlash tarixi va dinamik dasturlash g'oyasi…...4
        1.2 Dinamik dasturlash……………………………………………..6
         1.3 Dinamik dasturlashning tamoyili …………………………………...8
II.BOB. AMALIY QISM ……………………………………………………....10
         2.1 Dinamik dasturlashda muammolar yechim topishi....………………....10
         2.2 Dinamik dasturlash ikki yo‘l bilan amalga oshirilishi ...……..………..14
Xulosa…………………………….…………………………………………….…...25
Foydalanilgan adabiyotlar………………..………………………………………..26 Kirish
K е yingi   yillarda   amaliy   dasturchilarga   juda   ko’p   int е gratsion   dastur   tuzish
muhitlari taklif etilmoqda. Bu muhitlar u yoki bu imkoniyatlari bilan bir-biridan farq
qiladi.   Aksariyat   dasturlash   muhitlarining   fundam е ntal   asosi   C++   tiliga   borib
taqaladi.
Brute   force   (qo'pol   kuch)   yechimi   uchun   dastur   manba   kodi   ko‘proq   o‘sib
boradigan muammolarni hal qilish uchun C ++ dasturining manba kodi hisoblanadi.
C ++  dasturi muvaffaqiyatli tuzilib, windows va linux tizimida ishlaydi. 
Dinamik   dasturlash   -   bu   bir-birlari   bilan   takroran   bog'liq   bo'lgan   bir   nechta
bir   xil   kichik   topshiriqlarga   bo'lish   orqali   muammoni   hal   qilish   usuli.   Eng   oddiy
misol Fibonachchi raqamlari bo'lishi mumkin - bu ketma-ketlikdagi ma'lum bir sonni
hisoblash   uchun   birinchi   navbatda   birinchi   ikkitasini   qo'shib   uchinchi   raqamni,
so'ngra   to'rtinchisini   xuddi   shu   tarzda   ikkinchi   va   uchinchisiga   qarab   hisoblashimiz
kerak va hokazo .
Dinamika   elementlarining   bir-biridan   bog'liqligi   to'g'ridan-to'g'ri   berilishi
mumkin (agar bu raqamli ketma-ketliklar uchun muammo bo'lsa, ko'pincha shunday
bo'ladi).   Aks   holda,   dastlabki   bir   nechta   qiymatlarni   qo'lda   hisoblash   orqali   ma'lum
bir   qator   qatorlarni   (xuddi   shu   Fibonachchi   raqamlari   kabi)   topishga   harakat
qilishingiz mumkin. 
2 I.BOB. NAZARIY QISM
1.1 Dinamik dasturlash tarixi va dinamik dasturlash g'oyasi
"Dinamik   dasturlash"   iborasi   birinchi   marta   1940-yillarda   Richard   Bellman
tomonidan muammoning yechimini topish jarayonini tasvirlash uchun ishlatilgan, bu
yerda bitta masalaga javob uni "oldinda turgan" masalani echgandan keyingina olish
mumkin.   1953   yilda   u   ushbu   ta'rifni   zamonaviy   ta'rifga   o'zgartirdi.   Ushbu   soha
dastlab   tizimni   tahlil   qilish   va   muhandislik   sifatida   tashkil   etilgan   bo'lib,   IEEE
tomonidan tan olingan. Bellmanning dinamik dasturlashdagi hissasi optimallashtirish
masalasini   rekursiv   shaklda   qayta   tuzadigan   dinamik   dasturlash   nazariyasining
markaziy natijasi bo'lgan Bellman tenglamasi sarlavhasida abadiylashtirildi.
"Dinamik   dasturlash"   iborasidagi   "dasturlash"   so'zining   aslida   "an'anaviy"
dasturlash (yozish kodi) bilan deyarli hech qanday aloqasi yo'q va "optimallashtirish"
so'zi  bilan sinonim bo'lgan "matematik dasturlash" iborasida bo'lgani  kabi mantiqan
to'g'ri keladi.  Shuning uchun, bu yerda "dastur" so'zi muammoning yechimini topish
uchun   harakatlarning   maqbul   ketma-ketligini   anglatadi.   Masalan,   ko'rgazmadagi
tadbirlarning   ma'lum   bir   jadvalini   ba'zan   dastur   deb   atashadi.   Bu   holda   dastur
voqealarning qabul qilinadigan ketma-ketligi sifatida tushuniladi.
Dinamik   dasturlashdagi   maqbul   ichki   tuzilish   degani,   dastlabki   masalani   hal
qilish   uchun   kichikroq   kichik   muammolarni   eng   yaxshi   yechimidan   foydalanish
mumkin. 
Masalan,   grafadagi   bitta   tepadan   (s   bilan   belgilangan)   boshqasiga   (t   bilan
belgilanadigan) eng qisqa yo'lni quyidagicha topish mumkin: birinchi navbatda s ga t
ga   tutash   bo'lgan   barcha   tepaliklardan   eng   qisqa   yo'lni   hisoblaymiz,   so'ngra   s   ni
qo'shni tepaliklar bilan bog'laydigan qirralarning og'irliklarini hisobga olgan holda, t
ga eng yaxshi yo'lni tanlang (qaysi tepalik eng yaxshi o'tish kerak). 
Umuman olganda, biz quyidagi uchta bosqichni  bajarish orqali optimal pastki
tuzilma bilan muammoni hal qilishimiz mumkin.
1.Vazifani kichikroq topshiriqlarga bo'lish.
3 2.Xuddi   shu   uch   bosqichli   algoritmga   amal   qilgan   holda,   rekursiv   ravishda
subproblemalarning optimal yechimini topish.
3.Dastlabki   muammoning   yechimini   yaratish   uchun   avvalgi   muammolarning
olingan yechimidan foydalanish.
Subprolemalar doimiy kichik hajmda yechilishi mumkin bo'lgan muammoning
ahamiyatsiz holatiga kelguniga qadar ularni kichikroq hajmdagi kichik muammolarga
va   shu   kabilarga   bo'lish   yo'li   bilan   hal   qilinadi   (javobni   darhol   aytish   mumkin).
Masalan, agar biz n!  ni topishimiz kerak bo'lsa, unda ahamiyatsiz vazifa 1 ga teng! =
1 (yoki 0! = 1).
Dinamik dasturlashda  ustma-ust  keladigan vazifalar  ma'lum miqdordagi (bitta
emas)   kattaroq   muammolarni   yechish   uchun   ishlatiladigan   subtaskalarni   anglatadi
(ya'ni biz bir xil narsani bir necha marta bajaramiz).
1.2 Dinamik dasturlash .
Dinamik   dasturlash   ko‘plab   amaliyotlarga   ega.   Bu   yerda   joylashgan   turli   xil
klassik dinamik dasturlash muammolarini hal qilishga harakat qilish kerak.
C ++ da dinamik dasturlash
Dinamik dasturlash - bu polindrom vaqtida juda qiyin bo‘lib tuyulishi mumkin
bo‘lgan   muammolarni   hal   qilishning   kuchli   texnikasi.   Dinamik   dasturlash
paradigmasiga   asoslangan   algoritmlar   C++ning   ko‘plab   sohalarida,   shu   jumladan
sun'iy   intellektdagi   ko‘plab   misollarda   qo‘llaniladi   (rejalashtirish   muammolarini   hal
qilishdan ovozni tanib olishga qadar).
Umuman   olganda,   dinamik   dasturlashning   asosiy   maqsadi   -   ma'lum   bir
muammoli,   masalaning   turli   qismlarini   (pastki   muammolarni)   yechish,   so‘ngra
umumiy   echimga   erishish   uchun   pastki   muammolarning   keshlangan   yechimlaridan
foydalanish.
Dinamik dasturlashning qo’llanilishi - dinamik dasturlash yordamida yechilishi
mumkin bo‘lgan muammolar quyidagi ikkita asosiy xususiyatga ega:
4 1.  Ustma-ust keladigan muammolar
2.  Optimal pastki tuzilma
1) ustma-ust keladigan muammolar:
Ustma-ust tushadigan subproblemalar - bu muammoni bir necha marta ishlatiladigan
subproblemlarga ajratish mumkin bo‘lgan xususiyat.
Dinamik   dasturlash   asosan   bir   xil   pastki   muammolarning   yechimlari   qayta-
qayta kerak bo‘lganda ishlatiladi. Dinamik dasturlashda subproblemlarga hisoblangan
yechimlar   massivda   saqlanadi,   shunda   ularni   qayta   hisoblash   shart   emas.   Shunday
qilib,   dinamik   dasturlash   bir-birining   ustiga   chiqadigan   subproblemlar   bo‘lmagan
taqdirda foydali bo‘lmaydi, chunki yechimlarni qayta saqlash zarurati yo‘q.
2)   Optimal   pastki   tuzilma   -   bu   asl   muammoning   optimal   yechimini   uning
pastki   masalalarining   optimal   yechimlaridan   samarali   ravishda   qurish   mumkin
bo‘lgan xususiyatdir.
Dinamik   dasturlash   kichik   muammolarni   yechish   va   katta   muammoga
yechimni tezroq hisoblash uchun ushbu subproblemalarning natijalaridan foydalanish
orqali   ishlaydi.   Bo‘lish   va   zabt   etish   paradigmasidan   farqli   o‘laroq   (bunda   pastki
muammolarni   echish   g'oyasi   ham   qo‘llaniladi),   dinamik   dasturlash   odatda   kichik
qismni emas, balki barcha mumkin bo‘lgan kichik muammolarni echishni o‘z ichiga
oladi.   Ko‘pincha,   dinamik   dasturlash   algoritmlari   "massivni   to‘ldirish"   sifatida
tasavvur   qilinadi,   bu   yerda   massivning   har   bir   elementi   subproblem   natijasi   bo‘lib,
keyinchalik   qayta   hisoblanmasdan,   balki   qayta   ishlatilishi   mumkin.   Fibonachchi
raqamlarini hisoblash usullaridan biri bu haqiqatdan foydalanishdir ,  1 fibonacci (n) =
fibonacci (n-1) + fibonacci (n-2) va keyin kabi rekursiv funktsiyani yozing :
int fibonacci(int n)
{
    if (n == 0)
        {
        return 0;
        }
    if(n == 1)
5         {
        return 1;
        }
    else
        {
        return fibonacci(n - 1) + fibonacci(n - 2);
        }
}
Ushbu  algoritm   chidab  bo‘lmas  darajada  sekin   (uni  bajarish   uchun  eksponent
vaqt kerak bo‘ladi), chunki har safar fibonachchi (n - 1) hisoblansa, u fibonacci (n -
2)   ning   har   bir   qiymatini   fibonacci   (0)   ga   qayta   hisoblab   chiqadi.   Dinamik
dasturlashning yuragi natijalarni tejash orqali bunday qayta hisoblashdan qochishdir.
Fibonachchi raqamlarida boshqa, hatto oddiyroq yondashuvlar mavjud, ammo misol
asosiy g'oyani tushuntirishga xizmat qiladi.
Yanada   aniqroq   qilib   aytganda   d inamik   dasturlashda   asosan   matematikaning
ko p bosqichli eng maqbul (optimal) boshqarishga oid masalalar nazariyasi va ularniʻ
yechish usullarini o rganuvchi bo limi hisoblanadi. Bu yerda dasturlash tushunchasi	
ʻ ʻ
"rejalashtirish",   "qaror   qabul   qilish",   ya ni   "bir   qarorga   kelish"   ma nolarida   ham	
ʼ ʼ
qo llaniladi.  	
ʻ Bu   prinsip   dinamik   dasturlashning   asosiy   masalasini   oxiridan   boshlab
yechishga imkon beradi. Dinamik dasturlash chekli bosqichli   jarayonlardan tashqari ,
uzluksiz  davom   etadigan jarayonlar  uchun  ham   ishlab  chiqilgan. U  texnika, kosmik
parvozlar, xalq xo jaligini rejalashtirishning turli masalalarida eng maqbul yechimlar	
ʻ
topishga   imkon   beradi.   Dinamik   dasturlash   usuli   elektron   hisoblash   mashinalari ,
kompyuterlar   yordamida   tatbiq   qilinadi.   Dinamik   dasturlashda   yechish   jarayonini
alohida   bosqichlarga   bo‘lish   mumkin.   Ushbu   bo‘lish   turli   xil   printsiplarga   muvofiq
amalga   oshiriladi.   Ba'zi   vazifalar   vaqt   bo‘yicha,   boshqalarida   boshqaruv   ob'ektlari
bo‘yicha. Ba'zan bo‘linish sun'iy ravishda amalga oshiriladi. Ushbu yondashuv bizga
bitta   katta   o‘lchovli   muammoni   kichik   o‘lchamdagi   ko‘plab   muammolarga   bo‘lish
imkonini   beradi.   Bu   hisoblash   hajmini   sezilarli   darajada   kamaytiradi   va   boshqaruv
qarorlarini   qabul   qilish   jarayonini   tezlashtiradi.   Dinamik   dasturlash   tamoyili
6 shundaki,   eng   optimal   yo‘lning   har   qanday   qismi   optimaldir.   Bu   har   bir   bosqichda
oldingi bosqichlarda topilgan yo‘lning qismlaridan foydalangan holda optimal yo‘lni
topishga imkon beradi.
1.3 Dinamik dasturlashning tamoyili.
Funktsiyasining   ko rinishi   va   o zgaruvchilarga   qo yiladigan   cheklanishʼ ʼ ʼ
shartlari sistemasiga ko ra matematik dasturlash asosan olti turga ajratiladi:	
ʼ
Chiziqli dasturlash. 
Аgar   funktsiya   va   o zgaruvchilarga   qo yilgan   shartlar   chiziqli   ko rinishda	
ʼ ʼ ʼ
bo lsa,   u   holda   dasturlash   chiziqli   dasturlash   deyiladi.   Dasturlashning   bu   turi   eng	
ʼ
sodda va eng ko p o rganilgan bo lib, u amalda eng ko p qo llaniladi.	
ʼ ʼ ʼ ʼ ʼ
Chiziqli bo lmagan dasturlash. 
ʼ
Аgar   funktsiya   va   o zgaruvchilarga   qo yilgan   shartlar   chiziqli   bo lmagan	
ʼ ʼ ʼ
ko rinishda   bo lsa,   u   holda   bu   dasturlash   dinamik   chiziqli   bo lmagan   dasturlash	
ʼ ʼ ʼ
deyiladi.
Dinamik dasturlash.  
Аgar   o zgaruvchilar   vaqt   o zgarishi   bilan   o zgarsa   va   oldingi   bosqichdagi   natija	
ʼ ʼ ʼ
undan   keyingi   bosqich   natijasiga   ta sir   ko rsatsa,   bu   holda   matematik   dasturlash	
ʼ ʼ
dinamik dasturlash deyiladi.
Bu turdagi dasturlar iqtisodiy masalalarda ko p uchraydi. 	
ʼ
Bundan   tashqari   yuqoridagi   uch   turdagi   dasturlashdagi   o zgaruvchilarning   qabul	
ʼ
qilish qiymatlariga ko ra:	
ʼ
Diskret dasturlashtirish . 
Bunda o zgaruvchilar, ba zi diskret (uzlukli) qiymatlarini qabul qiladi.	
ʼ ʼ
Butun sonli dasturlashtirish . Bunda o zgaruvchilar faqat butun	
ʼ   son qiymatlarini
qabul   qilib ,   diskret   dasturlashning   xususiy   holidir.   (masalan   avtomobillar,   binolar,
pasajirlar).
Stoxastik dasturlashtirish . 
А gar   o zgaruvchilar   va   ularga   qo’yilgan   shartlar   ehtimolli   miqdorlar   bo lsa,	
ʼ ʼ
stoxastik dasturlash deyiladi.
7 Optimallashtirishning   eng   taniqli   usullaridan   biri   bu   o‘tgan   asrning   elliginchi
yillarida   amerikalik   olim   Richard   Bellman   tomonidan   taklif   etilgan   dinamik
dasturlashdir. Dinamik dasturlashni ko‘p bosqichli qarorlar qabul qilish jarayonlarini
tahlil   qilishda   ishlatiladigan   matematik   protseduralar   to‘plami   sifatida   aniqlash
mumkin.   O‘z   navbatida,   qaror   qabul   qilishning   ko‘p   bosqichli   jarayoni   umumiy
maqsadga   erishishga   qaratilgan   izchil   qarorlar   qabul   qilinadigan   faoliyat   sifatida
belgilanishi   mumkin.   Dinamik   dasturlashning   mohiyati   optimallashtirish   tamoyiliga
asoslanadi. Buni shunday tariflash mumkin – optimal strategiya   shunday xususiyatga
egaki , dastlabki  holat  va  yechim  qanday bo‘lishidan  qat'iy nazar, keyingi  yechimlar
dastlabki qarordan keyin yuzaga keladigan holat uchun eng optimal strategiyaga ega
bo‘lishi kerak
Dekstra algoritmi.  Dinamik dasturlashning bir usuli - bu "barcha juftliklar eng
qisqa   yo‘llarni"   og'irlikdagi   grafikada   hisoblash   muammosi.   Dekstra   algoritmi
ma'lum bir tepalik uchun muammoni hal qilsa ham, uni har bir tepalik uchun ishlatish
kerak   bo‘ladi   va   biroz   murakkab   algoritm   bo‘ladi.   Dinamik   dasturlash   sodda,   toza
algoritmni ishlab chiqaradi (garchi u tezroq bo‘lmagan bo‘lsa ham).
1-rasm.Dekstra algoritmining tasviri.
II.BOB. AMALIY QISM
8 2.1.   Dinamik dasturlashda muammolar qanday yechim topadi
Dinamik   dasturlash   (Dinamik   dasturlash   )   -   bu   polinom   vaqtidagi   ba'zi   bir
muayyan   turdagi   muammolarni   yechadigan   usuldir.   Dinamik   dasturlash   yechimlari
eksponentli   qo‘pol   usuldan   tezroq   va   ularning   to‘g'riligi   bilan   osongina   isbotlanishi
mumkin.   Muammoni   qanday   qilib   dinamik   ravishda   o‘ylashni   o‘rganishdan   oldin,
quyidagilarni o‘rganish Dinamik dasturlash ni hal qilish uchun qadamlar 
1) Dinamik dasturlash  muammosi ekanligini aniqlang
2) holatini ifodalashga qaror qiling  eng kam parametrlar
3) davlat munosabatlarini shakllantirish
4) tabulyatsiya qiling (yoki eslatma qo‘shing)
Muammoni   qanday   qilib   dinamik   dasturlash   muammosi   sifatida   tasniflash
mumkin?
Odatda,   ma'lum   miqdorlarni   maksimal   darajaga   ko‘tarish   yoki
minimallashtirishni talab qiladigan barcha masalalar yoki muayyan sharoitlarda yoki
ehtimollik   masalalari   bo‘yicha   tartibga   solishni   hisoblash   uchun   aytilgan
muammolarni hisoblash dinamik dasturlash yordamida hal qilinishi mumkin.
Barcha   dinamik   dasturlash   muammolari   bir-birining   ustiga   chiqadigan
subproblemlar   xususiyatini   to’ldiradi   va   klassik   dinamik   muammolarning   aksariyati
maqbul   podstruksiya   xususiyatlarini   ham   to’ldiradi.   Bir   marta,   biz   ushbu
xususiyatlarni   berilgan   masalada   kuzatamiz,   uni   dinamik   dasturlash     yordamida   hal
qilish mumkinligiga ishonch hosil qiling.
Dinamik   dasturlash     muammolari   davlat   va   ularning   o‘tishi   bilan   bog'liq.   Bu
juda   ehtiyotkorlik   bilan   bajarilishi   kerak   bo‘lgan   eng   asosiy   qadam,   chunki   davlat
o‘tish   holati   siz   belgilagan   davlatning   tanlanishiga   bog ’ liq.   Shunday   qilib,   keling,
"davlat" atamasi bilan nimani nazarda tutayotganimizni ko‘rib chiqaylik.
Holat   holatni   ma'lum   bir   pozitsiyani   yoki   berilgan   masalada   turg'unlikni
aniqlay   oladigan   parametrlar   to‘plami   deb   ta'riflash   mumkin.   Ushbu   parametrlar
to‘plami davlat maydonini kamaytirish uchun imkon qadar kichik bo‘lishi kerak.
Masalan: 
9 Dinamik   masalalarimizni   o‘z   holatda   indeks   va   vaznning   ikkita   parametrlari,
ya'ni   Dinamik   dasturlash     [indeks]   [vazn]   bilan   aniqlaymiz.   Bu   yerda   dinamik
dasturlash     [indeks]   [vazn]   bizga   sumkaning   og'irligi   sig'imga   ega   bo‘lgan   0
oralig'idan   indeksgacha   bo‘lgan   narsalarni   olib,   maksimal   foyda   keltirishi   haqida
xabar   beradi.   Shuning   uchun   bu   yerda   ko‘rsatkichlar   ko‘rsatkichi   va   og'irlik
birgalikda sumka muammosi uchun subproblemni aniq belgilashi mumkin.
Shunday   qilib,   bizning   birinchi   qadamimiz   muammoning   dinamik   dasturlash
muammosi ekanligini aniqlagandan so‘ng muammo uchun davlatni hal qilish bo‘ladi.
Ma'lumki,   Dinamik   dasturlash   yakuniy   natijani   shakllantirish   uchun
hisoblangan natijalardan foydalanish bilan bog'liq.
Shunday   qilib,   bizning   keyingi   qadamimiz   hozirgi   holatga   erishish   uchun
avvalgi davlatlar o‘rtasidagi munosabatni topishdir.
Shtatlar o‘rtasidagi munosabatlarni shakllantirish
Ushbu qism dinamik dasturlash  muammosini hal qilishning eng qiyin qismidir
va   juda   ko‘p   sezgi,   kuzatuv   va   amaliyotni   talab   qiladi.   Keling,   muammoning
namunasini ko‘rib chiqaylik 3 ta {1, 3, 5} raqamlarni hisobga olgan holda aytishimiz
kerak   "n"   raqamini   hosil   qilishning   umumiy   soni   berilgan   uchta   raqamning
yig'indisidan foydalanib hisoblash mumkin.
(takrorlash va turli xil tartibga solishga imkon berish).
Keling,   ushbu   muammo   haqida   dinamik   ravishda   o‘ylab   ko‘raylik.   Shunday
qilib,   birinchi   navbatda,   biz   ushbu   muammo   uchun   holatni   hal   qilamiz.   Vaziyatni
aniqlash  uchun   biz  n  parametrini  olamiz,  chunki  u  har   qanday  subproblemni  o‘ziga
xos   tarzda   aniqlay   oladi.   Shunday   qilib,   bizning   davlatimiz   dinamik   dasturlash
holatiga (n) o‘xshaydi. Bu erda holat (n) elementlar sifatida {1, 3, 5} dan foydalanib
n hosil qilish uchun tuzilgan tartiblarning umumiy sonini anglatadi.
Endi biz (n) holatini hisoblashimiz kerak.
Buni qanday qilish kerak?
Demak,  bu  erda  sezgi   harakatga  keladi.  Biz   berilgan  sonni   hosil  qilish  uchun
faqat 1, 3 yoki 5 dan foydalanishimiz mumkin. N = 1,2,3,4,5,6 uchun natijani bilamiz
10 deb taxmin qilaylik; termilogistic bo‘lib, buning natijasini bilamiz deylik   holat (n =
1), holat (n = 2), holat (n = 3), holat (n = 6)
Endi biz holatning natijasini bilmoqchimiz (n = 7). Qarang, biz faqatgina 1, 3 va 5 ni
qo‘shishimiz mumkin. Endi biz quyidagi 3 usul bilan jami 7 ni olishimiz mumkin: 
1) holatning barcha mumkin bo‘lgan kombinatsiyalariga 1 ni qo‘shish (n = 6)
Umuman,   holat   (n)   =   holat   (n-1)   +   holat   (n-3)   +   holat   (n-5)   shunday   qilib,
bizning kodimiz quyidagicha bo‘ladi:
// tartib sonini qaytaradi
// 'n' shakli
int solve(int n)
{
    // asosiy ish
    if (n < 0)
        return 0;
    if (n == 0)
        return 1;
    return solve(n-1) + solve(n-3) + solve(n-5);
}
Yuqoridagi   kod   bir   xil   holatni   qayta-qayta   hisoblagani   uchun   eksponentga
o‘xshaydi. Shunday qilib, biz faqat xotirani qo‘shishimiz kerak.  
Shtat uchun eslatma yoki jadvallar qo‘shish
Bu   dinamik   dasturiy   echimning   eng   oson   qismi.   Biz   faqat   davlat   javobini
saqlashimiz   kerak,   shunda   keyingi   safar   biz   ushbu   holatni   talab   qilsak,   biz   uni
xotiramizdan to‘g'ridan-to‘g'ri ishlata olamiz
int Dinamik_dasturlash [maxn];
// bu funktsiya ning sonini qaytaradi
// 'n' hosil qilish uchun kelishuvlar
int solve(int n)
{
// asosiy ish
11     if (n < 0)  
            return 0;
    if (n == 0)
            return 1;
    // allaqachon hisoblab chiqilganligini tekshirish
    if (Dinamik_dasturlash [n]!=-1)
            return Dinamik_dasturlash [n];
// natijani saqlash va qaytish
    return Dinamik_dasturlash [n] = solve(n-1) + solve(n-3) + solve(n-5);   
    }
Yana   bir   usul   -   bu   jadvallarni   qo‘shish   va   yechimni   takrorlash.   Qo‘shimcha
ma'lumot olish uchun jadvallar va esdaliklarga murojaat qiling.
Dinamik   dasturlashning   yana   bir   usuli   -   bu   "barcha   juftliklar   eng   qisqa
yo‘llarni"   og'irlikdagi   grafikada   hisoblash   muammosi.   Dekstra   algoritmi   ma'lum   bir
tepalik   uchun   muammoni   hal   qilsa   ham,   uni   har   bir   tepalik   uchun   ishlatish   kerak
bo‘ladi   va   biroz   murakkab   algoritm   bo‘ladi.   Dinamik   dasturlash   sodda,   toza
algoritmni ishlab chiqaradi (garchi u tezroq bo‘lmagan bo‘lsa ham).
Dinamik   dasturlash   muammolari   va   yechimlari   dinamik   dasturlash   bo‘yicha
yangi boshlanuvchilar  uchun qo‘llanma dinamik dasturlash - bu murakkab masalani
oddiyroq pastki muammolarga ajratish, ushbu kichik muammolarning har birini faqat
bir marta yechish va ularning yechimlarini massivda (odatda) saqlash yo‘li bilan hal
qilish usuli.   Endi  har doim bir xil  kichik muammo yuzaga keladi, uning yechimini
qayta   hisoblash   o‘rniga,   ilgari   hisoblangan   yechimlardan   foydalaniladi   va   shu   bilan
hisoblash vaqtini saqlash maydoni hisobiga tejaydi.
12 2.2. Dinamik dasturlash amalga oshirilishi mumkin bo’lgan yo‘llari.
Dinamik dasturlash ikki yo‘l bilan amalga oshirilishi mumkin:
1 -  xotira
2 -  jadval
Yodda saqlash  -  yodda saqlash  muammoni  hal  qilish uchun  yuqoridan pastga
texnikasini   qo‘llaydi,   ya'ni   u   asl   muammodan   boshlanadi,   so‘ng   uni   kichik
muammolarga ajratadi va shu kichik muammolarni xuddi shu tarzda hal qiladi.
Ushbu   yondashuvda   siz   allaqachon   barcha   pastki   muammolarni   hisoblab
chiqqan   deb   o‘ylaysiz.   Siz   odatda   asosiy   muammodan   rekursiv   qo‘ng'iroqni   (yoki
takrorlanadigan   ekvivalenti)   amalga   oshirasiz.   Siz   rekursiv   chaqiruv   hech   qachon
subproblemni   qayta   hisoblab   chiqmasligini   ta'minlaysiz,   chunki   natijalarni
keshlashingiz va shu tariqa takroriy sub-muammolarni qayta hisoblashingiz mumkin
emas.
Tabulyatsiya   -   tabulyatsiya   odatdagi   dinamik   dasturlash   usuli   hisoblanadi.
Muammoni   hal   qilish   uchun   tabulyatsiya   pastdan   yuqoriga   yondashuvdan
foydalanadi,   ya'ni   avval   barcha   tegishli   kichik   muammolarni   yechish   orqali,   odatda
natijalarni   massivda   saqlash   orqali.   Massivda   saqlangan   natijalar   asosida   "top"   /
original muammoning yechimi hisoblab chiqiladi.
Yodda   saqlash   va   jadvallarni   tuzish   -   bu   subproblemni   qayta   hisoblashdan
saqlanish  uchun   qo‘llaniladigan  har  ikkala  saqlash   texnikasi.  Misol  –  n ta  fibonacci
raqamini  yaratish   dasturini   ko‘rib   chiqing  fib  (n)  =  fib  (n-1)   +  fib  (n-2)   1-yechim   -
dinamik dasturlashsiz yuqoridan pastga yo‘naltirilgan usuldan foydalanish
int fib(int n) 
{ 
     if(n<=1)
        { 
          return n; 
        }
     else
        {
            return (fibonacci(n-1)+fibonacci(n-2)); 
13         } 
}
 (dinamik dasturlash)
return memoize[n]; 
Yechim 3 qismli dinamik dasturlash
int table[n]; 
void setup_fib() 
{ 
   table[0] = 1; 
   table[1] = 1; 
 for (int i = 2; i < n; i++) 
       table[i] = table[i-1] + table[i-2]; 
} 
int fib(int x)  
{  
return table[x];  
}
Brute   force   (qo'pol   kuch)   yechimi   uchun   dastur     manba   kodi   ko‘proq   o‘sib
boradigan muammolarni hal qilish uchun C ++ dasturining manba kodi. C ++ dasturi
muvaffaqiyatli   tuzilib,   linux   tizimida   ishlaydi.   Dasturning   chiqishi   quyida   ham
ko‘rsatilgan.
#include<iostream>
#include<climits>
using namespace std;
//   har   qanday   mumkin   bo‘lgan   ketma-ketlikni   rekursiv   tekshirish   va
o‘sayotganlarning eng uzunini tanlash uchun funktsiya
// ketma-ketliklar
int lis_brute(int a[], int joriy, int n, int oldingi)
{
        //   har   bir   o‘tish   paytida   biz   joriy   elementni   qo‘shishimiz   yoki   qo‘shmasligimiz
mumkin
    // keyingi tarkibga kiritish uchun boshqa elementlar qolmadi
14     if(joriy ==n)
        return 0;
    // agar joriy elementning qiymati oldingi elementdan kichik yoki unga teng bo‘lsa,
biz
    // uni o‘z ichiga olmaydi
    if(a[joriy]<= oldingi)
        {
            return lis_brute(a, joriy +1,n, oldingi);
        }
    // boshqa bir marta o‘z ichiga oladi
    // aks holda joriy elementni bir marta kiritadi va bir marta kiritmaydi
    // va ulardan eng uzun o‘sib boradigan ketma-ketliklarni tanlang
    return max(1+lis_brute(a, joriy +1,n,a[current]),lis_brute(a, joriy +1,n, oldingi));
}
int main()
{
    int i,n;
    cout<<" yo‘q, elementlarni kiriting. ";
    cin>>n;
    int a[n];
    cout<<" qiymatlarni kiriting "<<endl;
    for(i=0;i<n;i++)
    {
        cin>>a[i];
    }
    int oldingi =int_min;
        //   tanlangan   ketma-ketlikda   oldingi   elementning   qiymatini   hozirgacha   kuzatib
borish uchun to‘rtinchi dalil
    // bu int_min-ga o‘rnatildi, chunki dastlab tanlangan keyingi mavjud emas,
    // shunday qilib, oldingi element yo‘q
15     int result=lis_brute(a, 0, n, oldingi);
    cout<<" eng uzun o‘sib boradigan navbatdagi atamalar soni "<<result;
    return 0;
}
2-rasm. Dastur natijasi
Dinamik dasturlash  yechimi uchun dastur / manba kodi
Ko‘proq   o‘sib   boradigan   muammolarni   hal   qilish   uchun   C++   dasturining
manba kodi. C ++ dasturi muvaffaqiyatli tuzilib, linux tizimida ishlaydi. Dasturning
chiqishi quyida ham ko‘rsatilgan.
#include<iostream>
using namespace std; 
int lis(int a[], int n)
{
    int i, j;
    // n o‘lchamdagi b massivni yarating, ya'ni, b [n]
     // b [i] oxirgi element bo‘lgan [i] bilan eng uzun o‘sib boradigan ketma-ketlikning
qiymatini ifodalaydi
     // b [i] = subseuence tarkibiga a [i] qo‘shib, [0 ... i] massivi uchun eng uzun o‘sib
boruvchi ketma-ketlik
    //oxirida 
    int b[n];
    // b [i], b [i] irodasini hisoblash uchun biz albatta [a] ni kiritamiz
    // yoki 1 ga teng yoki 1 dan katta   
16     // shunday qilib, b ni boshlang
    for(i=0;i<n;i++)
        b[i]=1;
    // endi biz ushbu b qatorini to‘ldirishimiz kerak
        //   b   [i]   qiymatini   har   1   <=   i   <=   n   uchun   biron   bir   ketma-ketlikni   tekshirib
hisoblaymiz
       // b [0], b [1], ..., b [i-1] a [i] oldiga to‘g'ri kelishi va undan maksimalini tanlashi
mumkin  
    for(i=1;i<n;i++)
            {
               // har bir i uchun biz 0 <= j <i qiymatlarining barcha [a] i [b] ketma-ketliklari
uchun tekshiramiz.
        //qo‘shilishi mumkin va eng uzunini tanlang       
 for(j=0;j<i;j++)
        {
                        //agar   joriy   element,   ya'ni   ith   element   jth   elementdan   katta   qiymatga   ega
bo‘lsa, demak           
            // a [i] b [j] dan keyin qo‘shilishi mumkin degan ma'noni anglatadi
                       //biz ushbu ketma-ketliklarning eng uzunini topishga qiziqish bildirganimiz
sababli, biz ko‘rib chiqamiz
            // faqat b [j] ning qiymatlari b [i] ga teng bo‘lgan qiymatdan katta
            if(a[i]>a[j] && b[i]<b[j]+1)
                {
                b[i]=b[j]+1;
                }
        }
             }
             // endi, biz 0 <= i <n uchun b [i] ning barcha qiymatlarini hisobladik
                          //   berilgan   massivning   eng   uzun   o‘sib   boruvchi   ketma-ketligi   uzunligi
hammasidan kattaroqdir
17                          // bu qiymatlar, chunki eng uzun o‘sib boruvchi ketma-ketlik massivning
istalgan elementi bilan tugashi mumkin
             // b massivida maksimal elementni topish
             int max=0;
             for(i=0;i<n;i++)
                {
                    if(b[i]>max)
                    max=b[i];
                }
             return max;
             
}
 
int main()
{
    int i,n; 
    cout<<"yo‘q, elementlarni kiriting  ";
    cin>>n; 
    int a[n]; 
    cout<<"qiymat kiriting "<<endl;
    for(i=0;i<n;i++)
        {
        cin>>a[i];
        }
    int result=lis(a,n);
    cout<<" eng uzun o‘sib boradigan navbatdagi atamalar soni "<<result;
     return 0;
}
18 3-rasm. Dastur natijasi
Dasturni tushuntirish
Asosiy   funktsiyada   foydalanuvchidan   massivning   elmentlarini   kiritishni
so‘raymiz.   Ushbu   qatorni   parametr   sifatida   lis   funktsiyasiga   o‘tkazamiz.   Ushbu
funktsiya kutilgan natijani hisoblab chiqadi va uni qaytaradi.
Qaytgan qiymat ko‘rsatiladi.
Ish vaqti sinovlari
1. Ish-1:
2. C ++ lis.cpp
3. C ./a.out 
Yo‘qni kiriting. 5 elementlari
1
4
2
4
3
6. Eng uzun o‘sib boradigan navbatdagi atamalar soni 1 ga teng
2 Ikki o‘lchamli dinamik massivlarni e’lon qilish
#include <iostream>
#include <string.h>
19 using namespace std;
int main()
{
    int m; //satrlar soni
    int n; //ustunlar soni
    int i, j;
    int** matrix;
    cin >> m;
    cin >> n;
    matrix = new int*[m];
    for ( i = 0; i < m; i++)
        matrix[i] = new int[n];
    for ( i = 0; i < m; i++) // kiritish
        for ( j = 0; j < n; j++)
            {
                cout << "inter element " << "[" << i << "][" << j << "]  ";
                cin >> matrix[i][j];
            }
            cout << endl;
            for ( i = 0; i < m; i++)
                for ( j = 0; j < n; j++)
                    {
                        cout << matrix[i][j];
                    }
            cout << endl;
}
20 4-rasm. Dastr batijasi
Dinamik massivlardan foydalanib dasturlar yozish
Bir   o‘lchamli   massiv   berilgan.   Ushbu   massivda   faqat   bir   marta   qatnashgan
elementlar sonini aniqlab, shuncha elementdan iborat yangi massiv hosil qiling.
#include <iostream>
#include <time.h>
using namespace std;
int main()
{
   int n;
   cin>>n; 
   int a[n], n1=0, k=0;
   srand(time(null));
   for(int i=0; i<n; i++)
    {
        a[i]=rand()%100;
        cout<<a[i]<<" ";
    }
    cout<<endl;
   for(int i=0; i<n; i++){
    for(int j=0; j<n; j++)
        {
            if(a[i]==a[j])
            k++;
        }
21         if(k==1)
        {
            cout<<a[i]<<" ";
            n1++;
        }
        k=0;
   }
   cout<<n1<<" ta";
   int *b = new int[n1];
   return 0;
}
2. Massivning barcha tub son bo‘lgan elementlarini yangi massivga yozing.
#include <iostream>
#include <time.h>
using namespace std;
bool tubson(int a)
{
    int s=0;
    for(int i=1; i<=a; i++)
        if(a%i==0)
        s++;
    if(s==2)
        return true;
    else
        return false;
}
int main()
{
   int n;
   cin>>n;
22    int a[n], a, n1=0;
   srand(time(null));
   for(int i=0; i<n; i++)
    {
        a[i]=rand()%100;
        cout<<a[i]<<" ";
        a=a[i];
        if(tubson(a))
            N1++;
    }
    cout<<endl;
   int *b = new int[n1];
   int j=0;
   for(int i=0; i<n; i++)
   {
       a=a[i];
       if(tubson(a))
        {
            b[j]=a[i];
            j++;
        }
   }
   for(int i=0; i<n1; i++)
    cout<<b[i]<<" ";   return 0;    }
23 Xulosa
Ushbu   “Dinamik   dasturlash”   mavzusida   bajar il gan   kurs   ishini   o’qish   davomida
Dinamik   dasturlash   haqida   qo`shimcha   bilimlarga   ega   bo’lish   mumkin .   Dinamik
dasturlash  bu berilgan muammoni  yechish  uchun muqobil  va eng optimal  yechimni
topish  hisoblanadi.
Dinamik   dasturlash   ko‘plab   amaliyotlarga   ega   .   Ushbu   kurs   ishida   turli   xil
klassik   dinamik   dasturlash   muammolarini   hal   qilishga   harakat   qil ingan .   Dinamik
dasturlashda   polindrom   vaqtida   juda   qiyin   bo‘lib   tuyulishi   mumkin   bo‘lgan
muammolarni   hal   qilishning   kuchli   texnika si   hisoblanadi .   Dinamik   dasturlash
paradigmasiga   asoslangan   algoritmlar   C++ning   ko‘plab   sohalarida,   shu   jumladan
sun'iy   intellektdagi   ko‘plab   misollarda   qo‘llaniladi   Umuman   olganda,   dinamik
dasturlashning   asosiy   maqsadi   -   ma'lum   bir   muammoli   masalaning   turli   umumiy
y echimga  erishish   uchun muammolarning keshlangan   y echimlaridan foydalanishdir .
Dinamik   dasturlashdagi   maqbul   ichki   tuzilish   dastlabki   masalani   hal   qilish   uchun
kichikroq kichik muammolarni eng yaxshi   y echimidan foydalanish mumkin. Yanada
aniqroq   qilib   aytganda   d inamik   dasturlashda   asosan   matematikaning   ko p   bosqichliʻ
eng   maqbul   (optimal)   boshqarishga   oid   masalalar   nazariyasi   va   ularni   yechish
usullarini   o rganuvchi   bo limi   hisoblanadi.   Bu   yerda   dasturlash   tushunchasi	
ʻ ʻ
"rejalashtirish",   "qaror   qabul   qilish",   ya ni   "bir   qarorga   kelish"   ma nolarida   ham	
ʼ ʼ
qo llaniladi.   Bu   prinsip   dinamik   dasturlashning   asosiy   masalasini   oxiridan   boshlab	
ʻ
yechishga imkon berishini ko’rish mumkin.
24 Foydalanilgan Adabiyotlar
1. Weiss ,  M. Data Structures and Algorithm Analysis in C++, Fourth Edition. –
Addison-Wesley, 2014. – 656 p.
2. 11.  Xaljigitov A. Informatika va programmalash. O’quv qo’llanma. –Toshkent:
O’ZMU, 2005. - 145 b.
3. Christophids, N. Graph Theory: An Algorithmic Approach / N. Christofides.
4.  Sedgwick, R. Basic Algorithms in C ++: Algorithms for Graphs
 R. Sedvik; per. ingliz tilidan - SPb.: Diasoft, 2007. - 496 p.
5.   В.Р.Кулян,Е.А. Юникова, А.Б.Жилъцов.-К.: МАУП, 2000- 124 с.
6.  Рафгарден Тим   Р26 Совершенный алгоритм. Основы. — СПб.: Питер,
2019. — 256 с.: ил. — (Серия «Библиотека программиста»). 
ISBN 978-5-4461-0907-4
7.  Селиванова, И. А.   Построение и анализ алгоритмов обработки данных: 
учеб.-метод. пособие / И. А. Селиванова, В. А. Блинов. —
Екатеринбург : Изд-во Урал. ун-та, 2015. — 108 с.
8. Aniruddha chaudhari (2019) Dynamic programming and recursion | difference,
for example, advantages. Cse package.
9. Aleks allen (2020).Dynamic programming in C ++. C programming.
10. Vineet   choudhari   (2020)   Introduction   to   dynamic   programming.Developer
insider.
11. Aniruddha chaudhari (2019) Dynamic programming and recursion | difference,
for example, advantages. Cse package.
25 Foydalanilgan internet manzillari:
1.  cprogramming.com.
2. codechef.com
3. afteracademy.com
4. csestack.org.
5. developerinsider.com
6. programiz.com.
26

“Dinamik dasturlash usuli bilan yechiladigan masalalar” Mundarija Kirish ………………………………………………………………… .. …3 I.BOB. NAZARIY QISM ……………………………………….……….4 1.1 Dinamik dasturlash tarixi va dinamik dasturlash g'oyasi…...4 1.2 Dinamik dasturlash……………………………………………..6 1.3 Dinamik dasturlashning tamoyili …………………………………...8 II.BOB. AMALIY QISM ……………………………………………………....10 2.1 Dinamik dasturlashda muammolar yechim topishi....………………....10 2.2 Dinamik dasturlash ikki yo‘l bilan amalga oshirilishi ...……..………..14 Xulosa…………………………….…………………………………………….…...25 Foydalanilgan adabiyotlar………………..………………………………………..26

Kirish K е yingi yillarda amaliy dasturchilarga juda ko’p int е gratsion dastur tuzish muhitlari taklif etilmoqda. Bu muhitlar u yoki bu imkoniyatlari bilan bir-biridan farq qiladi. Aksariyat dasturlash muhitlarining fundam е ntal asosi C++ tiliga borib taqaladi. Brute force (qo'pol kuch) yechimi uchun dastur manba kodi ko‘proq o‘sib boradigan muammolarni hal qilish uchun C ++ dasturining manba kodi hisoblanadi. C ++ dasturi muvaffaqiyatli tuzilib, windows va linux tizimida ishlaydi. Dinamik dasturlash - bu bir-birlari bilan takroran bog'liq bo'lgan bir nechta bir xil kichik topshiriqlarga bo'lish orqali muammoni hal qilish usuli. Eng oddiy misol Fibonachchi raqamlari bo'lishi mumkin - bu ketma-ketlikdagi ma'lum bir sonni hisoblash uchun birinchi navbatda birinchi ikkitasini qo'shib uchinchi raqamni, so'ngra to'rtinchisini xuddi shu tarzda ikkinchi va uchinchisiga qarab hisoblashimiz kerak va hokazo . Dinamika elementlarining bir-biridan bog'liqligi to'g'ridan-to'g'ri berilishi mumkin (agar bu raqamli ketma-ketliklar uchun muammo bo'lsa, ko'pincha shunday bo'ladi). Aks holda, dastlabki bir nechta qiymatlarni qo'lda hisoblash orqali ma'lum bir qator qatorlarni (xuddi shu Fibonachchi raqamlari kabi) topishga harakat qilishingiz mumkin. 2

I.BOB. NAZARIY QISM 1.1 Dinamik dasturlash tarixi va dinamik dasturlash g'oyasi "Dinamik dasturlash" iborasi birinchi marta 1940-yillarda Richard Bellman tomonidan muammoning yechimini topish jarayonini tasvirlash uchun ishlatilgan, bu yerda bitta masalaga javob uni "oldinda turgan" masalani echgandan keyingina olish mumkin. 1953 yilda u ushbu ta'rifni zamonaviy ta'rifga o'zgartirdi. Ushbu soha dastlab tizimni tahlil qilish va muhandislik sifatida tashkil etilgan bo'lib, IEEE tomonidan tan olingan. Bellmanning dinamik dasturlashdagi hissasi optimallashtirish masalasini rekursiv shaklda qayta tuzadigan dinamik dasturlash nazariyasining markaziy natijasi bo'lgan Bellman tenglamasi sarlavhasida abadiylashtirildi. "Dinamik dasturlash" iborasidagi "dasturlash" so'zining aslida "an'anaviy" dasturlash (yozish kodi) bilan deyarli hech qanday aloqasi yo'q va "optimallashtirish" so'zi bilan sinonim bo'lgan "matematik dasturlash" iborasida bo'lgani kabi mantiqan to'g'ri keladi. Shuning uchun, bu yerda "dastur" so'zi muammoning yechimini topish uchun harakatlarning maqbul ketma-ketligini anglatadi. Masalan, ko'rgazmadagi tadbirlarning ma'lum bir jadvalini ba'zan dastur deb atashadi. Bu holda dastur voqealarning qabul qilinadigan ketma-ketligi sifatida tushuniladi. Dinamik dasturlashdagi maqbul ichki tuzilish degani, dastlabki masalani hal qilish uchun kichikroq kichik muammolarni eng yaxshi yechimidan foydalanish mumkin. Masalan, grafadagi bitta tepadan (s bilan belgilangan) boshqasiga (t bilan belgilanadigan) eng qisqa yo'lni quyidagicha topish mumkin: birinchi navbatda s ga t ga tutash bo'lgan barcha tepaliklardan eng qisqa yo'lni hisoblaymiz, so'ngra s ni qo'shni tepaliklar bilan bog'laydigan qirralarning og'irliklarini hisobga olgan holda, t ga eng yaxshi yo'lni tanlang (qaysi tepalik eng yaxshi o'tish kerak). Umuman olganda, biz quyidagi uchta bosqichni bajarish orqali optimal pastki tuzilma bilan muammoni hal qilishimiz mumkin. 1.Vazifani kichikroq topshiriqlarga bo'lish. 3

2.Xuddi shu uch bosqichli algoritmga amal qilgan holda, rekursiv ravishda subproblemalarning optimal yechimini topish. 3.Dastlabki muammoning yechimini yaratish uchun avvalgi muammolarning olingan yechimidan foydalanish. Subprolemalar doimiy kichik hajmda yechilishi mumkin bo'lgan muammoning ahamiyatsiz holatiga kelguniga qadar ularni kichikroq hajmdagi kichik muammolarga va shu kabilarga bo'lish yo'li bilan hal qilinadi (javobni darhol aytish mumkin). Masalan, agar biz n! ni topishimiz kerak bo'lsa, unda ahamiyatsiz vazifa 1 ga teng! = 1 (yoki 0! = 1). Dinamik dasturlashda ustma-ust keladigan vazifalar ma'lum miqdordagi (bitta emas) kattaroq muammolarni yechish uchun ishlatiladigan subtaskalarni anglatadi (ya'ni biz bir xil narsani bir necha marta bajaramiz). 1.2 Dinamik dasturlash . Dinamik dasturlash ko‘plab amaliyotlarga ega. Bu yerda joylashgan turli xil klassik dinamik dasturlash muammolarini hal qilishga harakat qilish kerak. C ++ da dinamik dasturlash Dinamik dasturlash - bu polindrom vaqtida juda qiyin bo‘lib tuyulishi mumkin bo‘lgan muammolarni hal qilishning kuchli texnikasi. Dinamik dasturlash paradigmasiga asoslangan algoritmlar C++ning ko‘plab sohalarida, shu jumladan sun'iy intellektdagi ko‘plab misollarda qo‘llaniladi (rejalashtirish muammolarini hal qilishdan ovozni tanib olishga qadar). Umuman olganda, dinamik dasturlashning asosiy maqsadi - ma'lum bir muammoli, masalaning turli qismlarini (pastki muammolarni) yechish, so‘ngra umumiy echimga erishish uchun pastki muammolarning keshlangan yechimlaridan foydalanish. Dinamik dasturlashning qo’llanilishi - dinamik dasturlash yordamida yechilishi mumkin bo‘lgan muammolar quyidagi ikkita asosiy xususiyatga ega: 4

1. Ustma-ust keladigan muammolar 2. Optimal pastki tuzilma 1) ustma-ust keladigan muammolar: Ustma-ust tushadigan subproblemalar - bu muammoni bir necha marta ishlatiladigan subproblemlarga ajratish mumkin bo‘lgan xususiyat. Dinamik dasturlash asosan bir xil pastki muammolarning yechimlari qayta- qayta kerak bo‘lganda ishlatiladi. Dinamik dasturlashda subproblemlarga hisoblangan yechimlar massivda saqlanadi, shunda ularni qayta hisoblash shart emas. Shunday qilib, dinamik dasturlash bir-birining ustiga chiqadigan subproblemlar bo‘lmagan taqdirda foydali bo‘lmaydi, chunki yechimlarni qayta saqlash zarurati yo‘q. 2) Optimal pastki tuzilma - bu asl muammoning optimal yechimini uning pastki masalalarining optimal yechimlaridan samarali ravishda qurish mumkin bo‘lgan xususiyatdir. Dinamik dasturlash kichik muammolarni yechish va katta muammoga yechimni tezroq hisoblash uchun ushbu subproblemalarning natijalaridan foydalanish orqali ishlaydi. Bo‘lish va zabt etish paradigmasidan farqli o‘laroq (bunda pastki muammolarni echish g'oyasi ham qo‘llaniladi), dinamik dasturlash odatda kichik qismni emas, balki barcha mumkin bo‘lgan kichik muammolarni echishni o‘z ichiga oladi. Ko‘pincha, dinamik dasturlash algoritmlari "massivni to‘ldirish" sifatida tasavvur qilinadi, bu yerda massivning har bir elementi subproblem natijasi bo‘lib, keyinchalik qayta hisoblanmasdan, balki qayta ishlatilishi mumkin. Fibonachchi raqamlarini hisoblash usullaridan biri bu haqiqatdan foydalanishdir , 1 fibonacci (n) = fibonacci (n-1) + fibonacci (n-2) va keyin kabi rekursiv funktsiyani yozing : int fibonacci(int n) { if (n == 0) { return 0; } if(n == 1) 5