Cod sursa(job #1778737)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 14 octombrie 2016 00:20:45
Problema Ferma2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <cstdio>
#include <cctype>
#define MAXBUF 1<<17
FILE*fi,*fout;
char buf[MAXBUF];
int pos=MAXBUF;
inline char nextch(){
    if(pos==MAXBUF){
        fread(buf,1,MAXBUF,fi);
        pos=0;
    }
    return buf[pos++];
}
inline int getnr(){
   char a=nextch();
   while(isdigit(a)==0)
      a=nextch();
   int nr=0;
   while(isdigit(a)==1){
      nr=nr*10+a-'0';
      a=nextch();
   }
   return nr;
}
#define MAXN 1000
int mat[MAXN+1][MAXN+1];
int dp[MAXN+1][MAXN+1];
int sl[MAXN+1][MAXN+1];
int sd[MAXN+1][MAXN+1];
int sc[MAXN+1][MAXN+1];
inline int getmin(int a,int b){
    if(a<b) return a;
    return b;
}
int main(){
   int i,j,n,m,l,k,sum,min,s;
   fi=fopen("ferma2.in" ,"r");
   fout=fopen("ferma2.out" ,"w");
   n=getnr();
   k=getnr();
   sum=0;
   for(i=1;i<=n;i++)
     for(j=1;j<=i;j++){
       mat[i][j]=getnr();
       sum+=mat[i][j];
       sl[i][j]=sl[i][j-1]+mat[i][j];
       sd[i][j]=sd[i-1][j-1]+mat[i][j];
       sc[i][j]=sc[i-1][j]+mat[i][j];
     }
   l=n-k;
   s=0;
   for(i=1;i<=l;i++)
    for(j=1;j<=i;j++)
      s+=mat[i][j];
   dp[l][l]=s;
   min=s;
   for(i=l+1;i<=n;i++){
      dp[i][l]=dp[i-1][l]+sl[i][l]-sd[i-1][l];
      min=getmin(min,dp[i][l]);
      for(j=l+1;j<=i;j++){
          dp[i][j]=dp[i][j-1]+sd[i][j]-sd[i-l][j-l]-sc[i][j-l]+sc[i-l][j-l];
          min=getmin(min,dp[i][j]);
      }
   }
   fprintf(fout,"%d" ,sum-min);
   fclose(fi);
   fclose(fout);
   return 0;
}