2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Tabula contentorum
Problemata ad programmationem dynamicam intelligendam introducuntur:
Analysis: (regressio vehemens)
Exemplum codicis Dfs: (quaero)
Recursus arboris ex vi recursionis generatae;
Exemplum codicis: (programma dynamica, incipiens a minimo subprobrio)
Processus exsecutionis (programma dynamicus):
Analysis: (dynamica programmatio)
Quid programmatio dynamica, quae problemata dynamica programmatio solvere potest ut medium, classificationem programmandi dynamicam et classificationem quaestionum specificarum quae specificae classificationes solvere possunt.
Algorithmus magni momenti est paradigma, quod problema in seriem minorum problematum corrumpit et repetitas calculos vitat solutiones problematum accommodans sub-solutionis, ita multo tempore efficientiam meliorem.
Quaestio haec per casum ascensionis gradus introducitur. Gradibus n gradibus dato in toto, potes singulis gradibus ascendere 1 vel 2 gradus.
Huius quaestionis finis est invenire numerum solutionum;Considerare possumus omnia possibilia per REGRESSUS adaequate absumens . Speciatim finge scalas ascendentes sicut processus multi- rotundi lectionis: incipiens a terra, eligens unum vel duos gradus singulos rotundos, addito 1 numero optionum quotiescumque cacumen scalarum attingis, et numerum optionum augendo, cum cacumen scalae attingis.
- # python代码示例
- def backrack(choices,state,n,res) :
- if state == n :
- res[0] += 1
- for choice in choices :
- if state + choice > n :
- continue
- backrack(choices,state+choice,n,res)
- def climbing_stairs_backrack(n) :
- choices = [1,2]
- state = 0
- res = [0]
- backrack(choices,state,n,res)
- return res[0]
- n = int(input())
- print(climbing_stairs_backrack(n))
- // c++代码示例
- void backrack(vector<int> &choices, int state, int n, vector<int> &res)
- {
- if (state == n )
- {
- res[0]++ ;
- }
- for (auto &choice : choices)
- {
- if (state + choice > n)
- {
- continue ;
- }
- backrack(choices, state + choice, n, res)
- }
- }
-
- int climbingStairsBackrack(int n)
- {
- vector<int> choices = {1 , 2 } ;
- int state = 0 ;
- vector<int> res = [0] ;
- backrack(choices, state, n, res) ;
- return res[0] ;
- }
Algorithmi regressi plerumque quaestionem explicite non dejiciunt, sed quaestionem tractant ut seriem decernendi gradus, et per heuristicos et putationes solutiones omnes possibilia quaerunt.
Hanc quaestionem resolvere conemur ex contextu compositionis problematum. Pone solutiones dp[i]scendi ad gradum i-th, tum dp[i] problema originale, eiusque problemata sub- includunt:
dp[i-1],dp[i-2],dp[1]
Cum tantum 1 vel 2 gradus in singulis rotundis ascendere possumus, cum scalae i-th stamus, tantum in i-1 vel i-2 gradibus in gyro priore stare potuimus. Aliis verbis, solum a gradu i-1 vel i-2 ad gradum i-th movere possumus.
Ex hoc magnum coniecturam facere possumus: numerus consiliorum, qui ad gradum i-1th ascenderunt, plus numerus consiliorum, quae ad gradum i-2th ascenderunt, aequalis est numerus consiliorum quae ad i ascenderunt. -th gradu. Formula haec est:
dp[i] = dp[i-1] + dp[i-2]
Hoc significat relationem recursive in aedificatione ascensu problematum, et quaestio originalis solvi potest solutionibus problematum sub- construendis.
- # python 代码示例
- def dfs(i : int) -> int :
- if i == 1 or i == 2 :
- return i
- count = dfs(i - 1) + dfs(i - 2)
- return count
- def climbing_stairs_dfs(n : int) -> int :
- retunr dfs(n)
- // c++ 代码示例
- int dfs(int i)
- {
- if (i == 1 || i == 2)
- {
- return i ;
- }
- int count = dfs(i - 1) + dfs(i - 2);
- return count ;
- }
- int climbingStairsDFS(int n)
- {
- retunr dfs(n) ;
- }
Ad quaestionem solvendam praedictam duplicationem in arbore recursiva, methodus inquisitionis scientificae adhiberi potest ad removendum magnum numerum arborum identicarum quae saepe constructae sunt, ita ut efficientiam calculi augeat. (imbricatis subproblems)
Computare omnes problematum sub-imbricationem semel tantum, debes declarare ordinatam nem ad solutionem uniuscuiusque quaestionis sub- notare, et sub- problemata per vestigationis processum imbricata putabis.
- # python 代码示例
- def dfs(i : int, mem : list[int]) -> int :
- if i == 1 or i == 2 :
- return i
- if mem[i] != -1 :
- return mem[i]
- count = dfs(i - 1, mem) + dfs(i - 2, mem)
- # 记录dfs(i)
- mem[i] = count
- return count
- def climbing_stairs_dfs_mem(n : int) -> int :
- mem = [-1] * (n + 1)
- return dfs(n, mem)
- // c++ 代码示例
- int dfs(int i, vector<int> &mem)
- {
- if (i == 1 || i == 2)
- {
- return i ;
- }
- if (mem != -1)
- {
- return mem[i] ;
- }
- int count = dfs(i - 1, mem) + dfs(i - 2, mem) ;
- mem[i] = count ;
- return count ;
- }
- int climbingStairsDFSMem(int n)
- {
- vector<int> mem(n + 1, -1) ;
- return dfs(n, mem) ;
- }
Post memoizationem, omnes problematum sub- imbricati semel tantum computantur, et tempus multiplicitas optimized ad O (n).
Investigatio motivata est methodus "top-ad-bottom". Ab problemate originali (nodi radicis) incipimus et majores problemata sub-reflexiva in problemata minora dissolvere donec minimas notae sub-nodi solvemus. . Postea solutiones ad problematum sub- ductae per iacum per cessionem colliguntur ad solutionem problematis originalis construendam.
E contra, programmatio dynamica est accessus "bottom-to-top": incipiens a solutione ad minima subproblem et itera- tive solutiones aedificandi ad ampliores problematum, donec solutio quaestionis originalis obtineatur.
Cum programmatio dynamica non includit processum regressum, solum opus est ut per ansam iteratio perficiatur sine recursione utendi.
- # python 代码示例
- def clibing_stairs_dp(n) :
- if n == 1 or n == 2 :
- return n
- dp = [0] * (n + 1)
- dp[1], dp[2] = 1, 2
- for i in range(3,n + 1) :
- dp[i] = dp[i-1] + dp[i- 2]
- return dp[n]
- // c++ 代码示例
-
- int climbingStairsDP(int n)
- {
- if (n == 1 || n == 2)
- {
- retunr n ;
- }
- vector<int> dp(n + 1, -1) ;
- dp[1] = 1 ;
- dp[2] = 2 ;
- for (int i = 3 ; i <= n ; i++)
- {
- dp[i] = dp[i - 1] + dp[i- 2] ;
- }
- return dp[n] ;
- }
Similis algorithmus regressus, programmatio dynamica etiam conceptu "statis" utitur ad certum statum problema solvendum. Exempli gratia: Status quaestionis scalae ascensus definitur ordo i gradus currentis.
Ex praedictis, terminis communibus pro terminis dynamicis compendiari possumus:
dp[i] tantum ad dp[i-1] et dp[i-2] refertur.
Loco utendi ordinata ad solutiones ad omnes subproblem reponendas, sicut duae variabiles opus sunt ut librum deinceps.
- # python 代码示例
- def clibing_stairs_dp_comp(n) :
- if n == 1 or n == 2 :
- return n
- a, b = 1, 2
- for _ in range(3, n + 1) :
- a, b = b , a + b
- return b
- // c++ 代码示例
- int climbingStairsComp(int n)
- {
- if (n == 1 || n == 2)
- {
- return n ;
- }
- int a = 1 , b = 2 ;
- for (int i = 3 ; i <= n ; i++)
- {
- int temp = b ;
- b = a + b ;
- a = temp ;
- }
- return b ;
- }
Spatium ordinata dp omittitur, et spatium multiplicitas ab O(n) ad O(1) reducitur.
In programmandis quaestionibus dynamicis, status hodiernus solum ad paucitas priorum status se habet. . Hoc spatium optimization ars appellatur "variabilium volubilis" vel "volubilis vestitus".