Pagini recente » Cod sursa (job #293166) | Cod sursa (job #1266715) | Cod sursa (job #661476) | Cod sursa (job #1422244) | Cod sursa (job #479977)
Cod sursa(job #479977)
#include <stdio.h>
#define NMax 2000
const char IN[] ="carnati.in";
const char OUT[] ="carnati.out";
int N,C;
int a[NMax][NMax];
short v[NMax][NMax];
struct client
{int t,p;
} c[NMax];
int abs(int x)
{
return (x<0) ? -x : x;
}
int pd()
{
int i,j,max;
for (i=0;i<N;i++)
a[i][i]= c[i].p - C,
v[i][i]= i,
max= (a[i][i]>max) ? a[i][i] : max;
for (j=2;j<=N;j++)
{
for (i=0;i+j-1<N;i++)
{
int x,y;
x=i;
y=i+j-1;
int p1,p2;
p1=a[x+1][y] - abs(c[x+1].t-c[x].t)*C; p1+= (c[v[x+1][y]].p<=c[x].p) ? c[v[x+1][y]].p : 0;
p2=a[x][y-1] - abs(c[y-1].t-c[y].t)*C; p2+= (c[v[x][y-1]].p<=c[y].p) ? c[v[x][y-1]].p : 0;
//a[x][y]= (p1>p2) ? p1 : p2;
if (p1>p2)
a[x][y]= p1,
v[x][y]=v[x+1][y];
else
a[x][y]=p2,
v[x][y]=v[x][y-1];
max= (a[x][y]>max) ? a[x][y] : max;
}
}
return max;
}
void citire()
{
int i;
freopen(IN,"r",stdin);
scanf("%d%d",&N,&C);
for (i=0;i<N;i++)
scanf("%d%d",&c[i].t,&c[i].p);
fclose(stdin);
}
void scriere(int x)
{
freopen(OUT,"w",stdout);
printf("%d\n",x);
fclose(stdout);
}
void sort(client a[])
{
int i,j;
for (i=0;i<N;i++)
{
int p=i;
for (j=i+1;j<N;j++)
if ( a[j].t<a[p].t || (a[j].t==a[p].t && a[j].p<a[p].p))
p=j;
if (i!=p)
{
client tmp= a[i];
a[i]=a[p];
a[p]=tmp;
}
}
}
int main()
{
citire();
sort(c);
scriere(pd());
return 0;
}