nefu1130Attack monsters(区间dp)

来源:互联网 发布:泰拉瑞亚辅助软件ios 编辑:程序博客网 时间:2024/04/28 22:47

这道题目让我改错误改了很久,但其实就是一道模板题稍稍变了个型,还有一点就是这个题是乱序的,需要排个序
下面是没优化的代码

#include <iostream>#include <string.h>#include <stdio.h>#include <algorithm>using namespace std;int n,l;int sum[305];int dp[305][305];const int INF=0x3f3f3f3f;void init(){    memset(sum,0,sizeof(sum));    memset(dp,0,sizeof(dp));}int main(){    while(scanf("%d%d",&n,&l)!=EOF)    {        if(n==0&&l==0)            break;        init();        for(int i=1;i<=n;i++)        {            scanf("%d",&sum[i]);        }        sum[n+1]=l;           sort(sum+1,sum+n+2);        for(int len=2;len<=n+1;len++)        {            for(int i=1;i+len-1<=n+1;i++)            {                dp[i][i+len-1]=INF;                for(int k=i;k<=i+len-1;k++)                {                    dp[i][i+len-1]=min(dp[i][i+len-1],dp[i][k]+dp[k+1][i+len-1]+sum[i+len-1]-sum[i-1]);                }            }        }        printf("%d\n",dp[1][n+1]);    }    return 0;}

下面是用平行四边形优化过的代码

#include <iostream>#include <string.h>#include <stdio.h>#include <algorithm>using namespace std;int n,l;int sum[305],s[305][305];int dp[305][305];const int INF=0x3f3f3f3f;void init(){    memset(sum,0,sizeof(sum));    memset(dp,0,sizeof(dp));    memset(s,0,sizeof(s));}int main(){    while(scanf("%d%d",&n,&l)!=EOF)    {        if(n==0&&l==0)            break;        init();        for(int i=1; i<=n; i++)        {            scanf("%d",&sum[i]);        }        sum[++n]=l;        sort(sum+1,sum+n+1);        for(int i=1; i<=n; i++)        {            dp[i][i]=0;            s[i][i]=i;//这个循环要注意,因为n的大小改变了,所以这里不要写到读入的那里,我就因为这个改了好半天,还是太菜        }        for(int len=2; len<=n; len++)        {            for(int i=1; i+len-1<=n; i++)            {                int j=i+len-1;                dp[i][j]=INF;                for(int k=s[i][j-1]; k<=s[i+1][j]; k++)                {                    if(dp[i][j]>dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1])                    {                        dp[i][j]=dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1];                        s[i][j]=k;                    }                }            }        }        printf("%d\n",dp[1][n]);    }    return 0;}
0 0