Dire Wolf HDU

来源:互联网 发布:汉族战斗民族知乎 编辑:程序博客网 时间:2024/05/29 00:34

ai,

居然是个区间dp,我当贪心,贪了很久


后来知道是区间dp,推了还是推错了。看来dp还是一点不会


两种方法:

#include <iostream>#include<algorithm>#include<string>#include<cstring>#include<cmath>#include <cstdio>using namespace std;const int maxn=200+10;int dp[maxn][maxn];int p[maxn];const int inf=0x3f3f3f3f;int main(){    int T;    scanf("%d",&T);    for(int kase=1;kase<=T;kase++)    {        int n;        scanf("%d",&n);        int ans=0;        for(int i=1;i<=n;i++)        {            int temp=0;            scanf("%d",&temp);            ans+=temp;        }        for(int i=1;i<=n;i++)        {            scanf("%d",&p[i]);        }        p[0]=0;        p[n+1]=0;        memset(dp,inf,sizeof(dp));        for(int i=1;i<=n+1;i++)           dp[i][i]=0;        for(int l=1;l<=n;l++)        {            for(int i=1;i+l<=n+1;i++)            {                int j=i+l;                for(int k=i;k<j;k++)                {                    dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+p[i-1]+p[j]);                }             //   cout<<" "<<i<<" "<<j<<" "<<dp[i][j]<<endl;            }        }        ans+=dp[1][n+1];        printf("Case #%d: %d\n",kase,ans);    }    return 0;}

大致相同

dp[i][j],区间[i,j]的最小代价,枚举区间最后一个被杀死的狼

#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#include<string>#include<iostream>#include<queue>#include<cmath>#include<map>#include<stack>#include<set>using namespace std;#define REPF( i , a , b ) for ( int i = a ; i <= b ; ++ i )#define REP( i , n ) for ( int i = 0 ; i < n ; ++ i )#define CLEAR( a , x ) memset ( a , x , sizeof a )const int INF=0x3f3f3f3f;typedef long long LL;typedef pair<int,int>pil;const int maxn=220;int n,t;int a[maxn],b[maxn];int dp[maxn][maxn];int main(){    int cas=1;    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        REPF(i,1,n)          scanf("%d",&a[i]);        REPF(j,1,n)          scanf("%d",&b[j]);        CLEAR(dp,0);        a[n+1]=b[n+1]=0;        for(int i=n;i>=1;i--)        {            for(int j=i;j<=n;j++)            {                dp[i][j]=INF;                for(int k=i;k<=j;k++)                    dp[i][j]=min(dp[i][j],dp[i][k-1]+dp[k+1][j]+a[k]+b[i-1]+b[j+1]);            }        }        printf("Case #%d: %d\n",cas++,dp[1][n]);    }    return 0;}