Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: Problema dinamica  (Citit de 1113 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
Mitza444
Client obisnuit
**

Karma: 6
Deconectat Deconectat

Mesaje: 82



Vezi Profilul
« : Ianuarie 28, 2013, 18:35:54 »

Salut !! Am incercat sa rezolv urmatoarea problema : http://campion.edu.ro/arhiva/index.php?page=problem&action=view&id=683
Am rezolvat problema prin programare dinamica ,dar nu stiu de ce iau 90.Am retinut toate cifrele care apar in numerele citite in ordine in sirul v dupa care am facut dinamica pentru a afla suma maxima pt. un prefix de lungime 1,2,3 ... , L.Am retinut doar 4 linii in matrice.Problema e ca iau WA pe ultimul test si nu vad ce caz as fi putut uita. Brick wall

Ma poate ajuta cineva ?
Multumesc.

Sursa mea:
Cod:
#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 2000
long S[4][maxn],nou;
int v[maxn],n,L;
char snr[16],sir[maxn];
int main(){
    int i,j;
    freopen("suma2.in","r",stdin);
    scanf("%d",&n);
    for(i=1;i<=n;++i){
        scanf("%s",&snr);
        strcat(sir,snr);
    }
    L=strlen(sir);
    for(i=1;i<=L;++i)
        v[i]=sir[i-1]-'0';
    fclose(stdin);
    for(i=0;i<4;++i)
        for(j=0;j<=n;++j)
            S[i][j]=-1;
    S[0][0]=0;S[1][1]=v[1];S[2][1]=v[1]*10+v[2];
    if(v[2])S[2][2]=v[1]+v[2];
    S[3][1]=v[1]*100+v[2]*10+v[3];
    if(v[2])S[3][2]=v[1]+v[2]*10+v[3];
    if(v[3] && S[3][2]<v[1]*10+v[2]+v[3]) S[3][2]=v[1]*10+v[2]+v[3];
    if(v[2] && v[3])S[3][3]=v[1]+v[2]+v[3];
    for(i=4;i<=L;i++){
        S[i%4][0]=-1;S[i%4][1]=-1;
        for(j=2;j<=i;j++){
            if(v[i]==0)S[i%4][j]=-1;
            else{
                if(S[(i-1+4)%4][j-1]!=-1){
                    nou=S[(i-1+4)%4][j-1]+v[i];
                    S[i%4][j]=nou;
                }
            }
            if(v[i-1]>0)
                if(S[(i-2+4)%4][j-1]!=-1){
                    nou=S[(i-2+4)%4][j-1]+v[i-1]*10+v[i];
                    if(nou>S[i%4][j])
                        S[i%4][j]=nou;
                }
            if(v[i-2]>0)
                if(S[(i-3+4)%4][j-1]!=-1){
                    nou=S[(i-3+4)%4][j-1]+v[i-2]*100+v[i-1]*10+v[i];
                    if(nou>S[i%4][j])
                        S[i%4][j]=nou;
                }
        }
    }
    freopen("suma2.out","w",stdout);
    printf("%ld\n",S[L%4][n]);
    fclose(stdout);
    return 0;
}
Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines