hdoj 4960 DP

来源:互联网 发布:淘宝创业成功故事 编辑:程序博客网 时间:2024/05/21 22:28

这是题解:http://blog.sina.com.cn/u/1809706204

已经说得很明白了。

直接上代码:

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define MAX 5555#define INF 0x3f3f3f3fint pa[2][MAX],a[MAX];__int64 v[MAX];int N,num;__int64 suml,sumr;int dp[MAX];void deal(){    int i,j,k=1;    suml=v[1],sumr=v[N];    pa[0][0]=0;    pa[1][0]=N+1;    for(i=1,j=N;i<j;)    {        if(suml==sumr)        {            pa[0][k]=i;            pa[1][k++]=j;            i++,j--;            suml+=v[i];            sumr+=v[j];        }        else if(suml<sumr)        {            i++;            suml+=v[i];        }        else        {            j--;            sumr+=v[j];        }    }    num=k;}void work(){    int i,j,k;    int ans=INF;    memset(dp,0x3f,sizeof(dp));    dp[0]=0;a[0]=0;    for(i=1;i<num;i++)    {        for(j=0;j<i;j++)        {            dp[i]=min(dp[i],dp[j]+a[pa[0][i]-pa[0][j]]+a[pa[1][j]-pa[1][i]]);        }    }    for(i=0;i<num;i++)    {        int len=a[pa[1][i]-pa[0][i]-1];        ans=min(ans,dp[i]+a[pa[1][i]-pa[0][i]-1]);    }    printf("%d\n",ans);}int main(){    int i,j;    while(scanf("%d",&N),N)    {        for(i=1;i<=N;i++)        {            scanf("%I64d",&v[i]);        }        for(i=1;i<=N;i++)        {            scanf("%d",&a[i]);        }        deal();        work();    }    return 0;}


 

0 0