区间dp
这题dp是小头,简单的区间dp即可,输出格式控制是大头,比较麻烦,但是属于比较水的部分,花点时间都能搞出来
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
int dp[11][11];
int x[11];
int y[11];
int mark[11][11];
string s[11];
int p[11];
int interval(int l,int r)
{
if (l==r)
return 0;
if (r-l==1)
{
dp[l][r]=x[l]*y[l]*y[r];
return dp[l][r];
}
if (dp[l][r]>0)
return dp[l][r];
for (int i=l;i<=r;i++)
{
if (dp[l][r]==0||dp[l][r]>interval(l,i)+interval(i+1,r)+x[l]*y[i]*y[r])
{
dp[l][r]=interval(l,i)+interval(i+1,r)+x[l]*y[i]*y[r];
mark[l][r]=i;
}
}
return dp[l][r];
}
void ans(int l,int r)
{
if (r==l+1)
{
s[l]=s[l]+" x ";
return ;
}
if (r==l)
return ;
int i=mark[l][r];
p[i]=1;
if (l!=i)
{
s[l]='('+s[l];
s[i]=s[i]+')';
}
if (r!=i+1)
{
s[i+1]='('+s[i+1];
s[r]=s[r]+')';
}
ans(l,i);
ans(i+1,r);
}
int main()
{
int n;
int t=1;
while (cin>>n&&n)
{
s[1]="A1";
s[2]="A2";
s[3]="A3";
s[4]="A4";
s[5]="A5";
s[6]="A6";
s[7]="A7";
s[8]="A8";
s[9]="A9";
s[10]="A10";
for (int i=1;i<=n;i++)
cin>>x[i]>>y[i];
memset(dp,0,sizeof(dp));
memset(p,0,sizeof(p));
interval(1,n);
ans(1,n);
cout<<"Case "<<t<<": ";
t++;
s[1]='('+s[1];
s[n]=s[n]+')';
for (int i=1;i<=n;i++)
{
cout<<s[i];
if (p[i])
cout<<" x ";
}
cout<<endl;
}
return 0;
}