Cod sursa(job #637080)

Utilizator blue_phoenixPosea Elena blue_phoenix Data 20 noiembrie 2011 11:41:52
Problema Ferma2 Scor 30
Compilator cpp Status done
Runda .com 2011 Marime 3.71 kb
#include <stdio.h>
#include <vector>
#include <bitset>
using namespace std;
#define maxn 1005
vector <int> tri[maxn];//tine triunghiul initial
struct nod{
   int l1,l2,ziua,castig;//ziua repr generatia, pot sa nu o tin minte daca smecheresc niste indici
}coada[maxn*maxn];

//bitset <maxn> calculat[maxn][maxn];

int n;

int suma1(int foaia, int l2,int l3){//foile sunt num incepand cu 1
    //latura 1
   //printf("SUMA1\n");
    int i;
    int s=0;
    int li=foaia+l3,ls=n-l2;
    for(i=li;i<=ls;i++){
        s+=tri[i][foaia-1];
        //printf("aduna la suma %d\n",tri[i][foaia-1]);
}
    return s;
}

int suma2(int foaia,int l1, int l3){
    int i;
    int s=0;
    int li=l1,ls=n-l3-foaia+1;
    //printf("SUMA2\n");
    for(i=li;i<ls;i++){
        s+=tri[n-foaia+1][i];
        //printf("aduna la suma %d\n",tri[n-foaia+1][i]);
}
    return s;
    
}

int suma3(int foaia, int l1, int l2){
   //printf("SUMA3\n");
    int i;
    int s=0;
    int li=l1+foaia,ls=n-l2;
    for(i=li;i<=ls;i++){
        s+=tri[i][i-foaia];
        //printf("aduna la suma %d\n",tri[i][i-foaia]);
}
    return s;    
}

int main(){
  int k;
  int castig=0;
  int mdef=-1;
  FILE *fin=fopen("ferma2.in","r");
  FILE *fout=fopen("ferma2.out","w");
  fscanf(fin,"%d%d",&n,&k);
  int a;
  int i,j;
  for(i=1;i<=n;i++){
    for(j=0;j<i;j++){
      fscanf(fin,"%d",&a);
      tri[i].push_back(a);
    }
}  
   int li=0,ls=1;
   coada[li].l1=0;
   coada[li].l2=0;
   coada[li].castig=0;
   coada[li].ziua=0;//la sf zilei 0 n-am vandut nimic si castigul e 0
   //ATENTIE! nu o marchez ca "calculata"
   int l3;
   while(li<ls && coada[li].ziua<k){
     //expandez coada[li]
        //as vrea sa vand o cateta 1
        coada[ls].l1=coada[li].l1+1;
        coada[ls].l2=coada[li].l2;
        coada[ls].ziua=coada[li].ziua+1;
        l3=coada[ls].ziua-coada[ls].l1-coada[ls].l2;
        coada[ls].castig=coada[li].castig+suma1(coada[ls].l1,coada[ls].l2,l3);
        //printf("adaug in coada elementul (%d,%d,%d,%d), care provine din (%d,%d,%d,%d)\n",coada[ls].ziua,coada[ls].l1,coada[ls].l2,coada[ls].castig,coada[li].ziua,coada[li].l1,coada[li].l2,coada[li].castig);
        if(mdef<coada[ls].castig)mdef=coada[ls].castig;
        //calculat[coada[ls].l1][coada[ls].l2]=1;
        ls++;
       
        //daca azi am vandut cateta2
        //if(!calculat[coada[li].l1][coada[li].l2+1]){
            coada[ls].l1=coada[li].l1;
            coada[ls].l2=coada[li].l2+1;
            coada[ls].ziua=coada[li].ziua+1;
            l3=coada[ls].ziua-coada[ls].l1-coada[ls].l2;
            coada[ls].castig=coada[li].castig+suma2(coada[ls].l2,coada[ls].l1,l3);
            //calculat[coada[ls].l1][coada[ls].l2]=1;
            //printf("adaug in coada elementul (%d,%d,%d,%d), care provine din (%d,%d,%d,%d)\n",coada[ls].ziua,coada[ls].l1,coada[ls].l2,coada[ls].castig,coada[li].ziua,coada[li].l1,coada[li].l2,coada[li].castig);
            if(mdef<coada[ls].castig)mdef=coada[ls].castig;
            ls++;
        //}

        //daca azi am vandut ipotenuza
        //if(!calculat[coada[li].l1][coada[li].l2]){
            coada[ls].l1=coada[li].l1;
            coada[ls].l2=coada[li].l2;
            coada[ls].ziua=coada[li].ziua+1;
            l3=coada[ls].ziua-coada[ls].l1-coada[ls].l2;
            coada[ls].castig=coada[li].castig+suma3(l3,coada[ls].l1,coada[ls].l2);
            //calculat[coada[ls].l1][coada[ls].l2]=1;
            //printf("adaug in coada elementul (%d,%d,%d,%d), care provine din (%d,%d,%d,%d)\n",coada[ls].ziua,coada[ls].l1,coada[ls].l2,coada[ls].castig,coada[li].ziua,coada[li].l1,coada[li].l2,coada[li].castig);
            if(mdef<coada[ls].castig)mdef=coada[ls].castig;
            ls++;
        //}
     li++;   
   }

  fprintf(fout,"%d\n",mdef);
  //printf("%d\n",suma1(1,0,2));
  return 0;
}