UVA 662 Fast Food 区间DP

来源:互联网 发布:alien skin x2 mac 编辑:程序博客网 时间:2024/05/11 15:35

参照了别人的思路,

#include <map>#include <set>#include <list>#include <cmath>#include<cctype>#include <ctime>#include <deque>#include <stack>#include <queue>#include <cstdio>#include <string>#include <vector>#include<climits>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>#define LL long long#define PI 3.1415926535897932626using namespace std;int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);}#define MAXN 210int dp[MAXN][MAXN],fa[MAXN][MAXN];int N,K,id;int mid[MAXN][MAXN];int src[MAXN];int dis[MAXN][MAXN];void init(){    for (int i=1;i<=N;i++) scanf("%d",&src[i]);    memset(dis,0,sizeof(dis));    for (int i=1;i<=N;i++)    {        mid[i][i]=i;        for (int j=i+1;j<=N;j++)        {          int m=(i+j)/2;          mid[i][j]=m;          for (int k=i;k<=j;k++)            dis[i][j]+=abs(src[k]-src[m]);        }    }}void calcu(){    for (int i=1;i<=N;i++) for (int j=0;j<=K;j++) dp[i][j]=1e8;    memset(dp[0],0,sizeof(dp[0]));    for (int i=1;i<=N;i++)        for (int j=1;j<=K;j++)         for (int k=1;k<=i;k++)    {        if (dp[k-1][j-1]+dis[k][i]<=dp[i][j])        {            dp[i][j]=dp[k-1][j-1]+dis[k][i];            fa[i][j]=k;        }    }}void output(int i,int j){    if( i<1 || j<1)return ;    output(fa[i][j]-1,j-1);    printf("Depot %d at restaurant %d serves restaurant", id++, mid[fa[i][j]][i]);    if (fa[i][j]==i) printf(" %d\n",i);    else printf("s %d to %d\n",fa[i][j],i);}int main(){    int kase=1;    while (scanf("%d%d",&N,&K)!=EOF)    {        if (N==0 && K==0) break;        init();        calcu();        printf("Chain %d\n",kase++);        id=1;        output(N,K);        printf("Total distance sum = %d\n\n", dp[N][K]);    }    return 0;}



0 0
原创粉丝点击