Revizia anterioară Revizia următoare
Soluţia problemei Shoturi
h2. Soluţie backtracking - 10 puncte
Generăm toate variantele posibile ale vectorului pentru care
. Această soluţie obţine 0 sau 10 puncte în funcţie de implementarea backtrackingului, care ar avea complexitatea
amortizat.
Soluţie N*K2 - 50 puncte
Această soluţie presupune tehnica programării dinamice. Vom folosi matricea dp[n][k], pentru care:
- dp[i][j] = suma potenţelor tuturor amestecurilor posibile ingerând j
shoturipăhărele din primele isubstanţe interzisesucuri.
De aici deducem recurenţa:
De ce? Pentru că, din cum am definit dinamica, dp[i-1][x] = suma potenţelor tuturor amestecurilor posibile ingerând x păhărele din primele i-1 sucuri. Cum dp[i][j] presupune ingerarea a j pahare => se vor ingera j-x pahare de tipul i, care vor inmulţi fiecare potenţă cu . Adunăm dp[i-1][j] la dp[i][j] deoarece tinerii pot alege sa nu bea niciun shot de tipul i.
Observatie: ,
, ca să ne iasă calculele :)
Voi exemplifica explicaţia cu cod în limbajul C++
dp[1][0]=1;
for(j=1; j<=k; j++)
dp[1][j]=(1LL*j*hazard[1])%MOD;
for(i=2; i<=n; i++)
{
dp[i][0]=1;
for(j=1; j<=k; j++)
{
for(x=0; x<=j-1; x++)
dp[i][j]=(dp[i][j]+1LL*dp[i-1][x]*(j-x)*hazard[i])%MOD;
dp[i][j]=(dp[i][j]+dp[i-1][j])%MOD;
}
}
Solutie N*K, memorie N*K - 80 puncte
Trecerea de la O(N*K2) la O(N*K) se face cu ajutorul sumelor parţiale.
Observăm că, dacă atunci când parcurgem cu j-ul ţinem o variabilă sum = pe care o updatăm adaugând