【dp】직선 2중치 문제

1663 단어 동적 기획
문제 설명:
직선 L 및 L에 n+1 점 x 0 < x1 <...x="">n.직선 L에 있는 모든 점xi는 하나의 권한을 가진다 w(xi).각각의 방향변(xi,xi-1)도 있고 비음변장 d(xi,xi-1)도 있다.직선 L에 있는 각 점xi는 고객으로 볼 수 있는데 그 서비스 수요량은 w(xi)이다.각 변(xi,xi-1)의 변장 d(xi,xi-1)는 운송 비용으로 볼 수 있다.만약에 점xi처에 서비스 기구를 설치하지 않으면 점xi처의 서비스 수요를 점xj처로 이동하는 서비스 기구가 지불해야 하는 서비스 이전 비용을 w(xi)*d(xi,xj)로 한다.점x0에 서비스 기구를 설치했고 현재 직선 L에 2곳의 서비스 구조를 증설하여 전체 서비스 이전 비용을 최소화해야 한다.
프로그래밍 작업:
주어진 직선 L에 대해 프로그래밍은 직선 L에 2곳의 서비스 기구를 증설하는 최소 서비스 이전 비용을 계산한다.
데이터 입력:
입력한 첫 번째 줄에는 양의 정수 n이 있는데 이것은 직선 L에 점x0 외에 n개의 점x01<...>n.다음 n 줄에는 줄마다 두 개의 정수가 있다.i+1행의 두 정수는 각각 w(xn-i-1)와 d(xn-i-1, xn-i-2)를 나타낸다.
결과 출력:
출력 계산의 최소 서비스 이전 비용.
예제:
 9  1 2  2 1  3 3  1 1  3 2  1 6  2 1  1 2  1 1
26
핵심 사상:
322의 m를 2로 바꾸면 더 좋은 해석이 있을 것 같아서 몰라요.
4
var
 f:array[0..20010]of longint;
 dist,wt,swt:array[0..20010]of longint;
 n,m:longint;
procedure init;
var
 d,w,i:longint;
begin
 dist[1]:=0;wt[0]:=0;swt[1]:=0;
 readln(n);
 m:=2;
 readln(wt[1],dist[2]);
 fori:=2 to n do
 begin
  readln(w,d);
  wt[i]:=wt[i-1]+w;
  dist[i+1]:=dist[i]+d;
  swt[i]:=swt[i-1]+w*dist[i];
 end;
end;
function getw(x,y:longint):longint;
begin
 ifx>y then exit(0)
 else exit((wt[y-1]-wt[x])*dist[y]-(swt[y-1]-swt[x]));
end;
procedure comp;
var
 i,j,k,tmp:longint;
begin
 fori:=1 to n do f[i]:=getw(0,i+1);
 forj:=1 to m do
 begin
  for i:=n downto j+1 do
   begin
    f[i]:=getw(1,i+1);
    for k:=2 to i do
     begin
      tmp:=f[k-1]+getw(k,i+1);
      if tmp
제목 출처: 제3장 동태적 기획

좋은 웹페이지 즐겨찾기