http://poj.org/problem?id=1157
这个定义只是为了更好的理解dp,效率极其低下,自己的原因。
设dp[i][j]表示前i朵花放在前j个位置获得最大值,dp[i][j]=Max(dp[i-1][k],i1<=k<=j-1 + a[i][k2],k<=k2<=j,dp[i][k],i<=k<=j);
#include <cstdio>
const int maxn=1<<30;
int a[110][110],dp[110][110];
int main(){
int f,v;
scanf("%d%d",&f,&v);
for(int i=1;i<=f;i++)
for(int j=1;j<=v;j++)
scanf("%d",&a[i][j]);
for(int i=1;i<=v;i++)
dp[1][i]=a[1][i];
for(int i=1;i<=f;i++)
for(int j=i;j<=v;j++){
int Max=-maxn;
for(int i1=i-1;i1<=j-1;i1++){
int pre=dp[i-1][i1];
for(int j1=i1+1;j1<=j;j1++)
if(pre+a[i][j1]>Max)Max=pre+a[i][j1];
}
for(int k=i;k<=j;k++)
if(Max<dp[i][k])Max=dp[i][k];
dp[i][j]=Max;
}
printf("%d\n",dp[f][v]);
return 0;
}
状态对了,都能过。
AC之路,我选择坚持~~