今天终于有时间开始刷能量项链了,刷刷写好DP方程式之后
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXN 110
int dp[MAXN][MAXN];
int w[MAXN];
int main(void)
{
memset(dp,0,sizeof(dp));
int n;
int i,j,k;
int max,result;
int len;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&w[i]);
}
for(len=2;len<=n;len++)
{
for(i=1;i<=n;i++)
{
j=i+len-1;
max=0;
for(k=i;k<j;k++)
{
result=dp[i][(k-1)%n+1]+dp[k%n+1][(j-1)%n+1]+w[i]*w[k%n+1]*w[j%n+1];
if(max<result)
max=result;
}
dp[i][(j-1)%n+1]=max;
}
}
for(i=1;i<=n;i++)
{
if(dp[i][(i-1)%n+1]>max)
max=dp[i][(i-1)%n+1];
}
printf("%d\n",max);
return 0;
}
结果才拿了十分,大惊,细细检查,发现唯一有可能错的就是在最后判断最大值的循环处
再次修改
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXN 110
int dp[MAXN][MAXN];
int w[MAXN];
int main(void)
{
memset(dp,0,sizeof(dp));
int n;
int i,j,k;
int max,result;
int len;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&w[i]);
}
for(len=2;len<=n;len++)
{
for(i=1;i<=n;i++)
{
j=i+len-1;
max=0;
for(k=i;k<j;k++)
{
result=dp[i][(k-1)%n+1]+dp[k%n+1][(j-1)%n+1]+w[i]*w[k%n+1]*w[j%n+1];
if(max<result)
max=result;
}
dp[i][(j-1)%n+1]=max;
}
}
for(i=1;i<=n;i++)
{
if(dp[i][(i+n-2)%n+1]>max)
max=dp[i][(i+n-2)%n+1];
}
printf("%d\n",max);
return 0;
}
(i-1)%n+1与(i+n-2)%n+1循环得到的结果完全不同……
这告诫我一定要先写一下伪代码,判定表达式……
十分钟啊……