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;
}