D - đá xác nhập vấn đề
Description
Ở một cái hình tròn sân thể dục bốn phía bày n đôi đá. Hiện muốn đem đá có thứ tự mà xác nhập thành một đống. Quy định mỗi lần chỉ có thể tuyển liền nhau 2 đôi đá xác nhập thành tân một đống, cũng đem tân một đống đá số nhớ vì nên thứ xác nhập đạt được. Thí thiết kế một cái thuật toán, tính toán ra đem n đôi đá xác nhập thành một đống nhỏ nhất đạt được cùng lớn nhất đạt được.
Đối với cấp định n đôi đá, tính toán xác nhập thành một đống nhỏ nhất đạt được cùng lớn nhất đạt được.
Input
Đưa vào số liệu đệ 1 hành là chính số nguyên n, 1≤n≤100, tỏ vẻ có n đôi đá. Đệ nhị hành có n cái số, phân biệt tỏ vẻ mỗi đôi đá cái số.
Output
Phát ra số liệu có hai hàng, đệ 1 hành trung số là nhỏ nhất đạt được, đệ 2 hành trung số là lớn nhất đạt được.
Sample
Input
4
4 4 5 9
Output
43
54
Cùng loại Ma trận liền thừa vấn đề
Tương đồng: Đều là mỗi lần tuyển liền nhau hai cái
Bất đồng: ( ở một cái hình tròn sân thể dục bốn phía ) làm thành một vòng tròn, chính là có thể đầu đuôi tương liên
Giải quyết đầu đuôi tương liên liền đem danh sách ở số tổ nhớ hai lần,
Này mấy cái khu gian phân biệt cầu ra lớn nhất nhỏ nhất, cuối cùng đem này mấy cái khu gian lớn nhất nhỏ nhất lấy ra tới tương đối
Mỗi cái khu gian max min cầu pháp cùng Ma trận liền thừa cùng loại nhưng dời đi phương trình bất đồng
#include<iostream>
#include<algorithm>
#include<memory.h>
#defineinf 0x3f3f3f3f
usingnamespacestd;
intmain()
{
intn,i,j,k,a[202],dp[202][202],dpm[202][202];
cin>>n;
memset(dp,0,sizeof(dp));
memset(dpm,0,sizeof(dpm));
for(i=1;i<=n;i++)
{
cin>>a[i];
a[i+n]=a[i];
}
intsum[202];sum[0]=0;
for(i=1;i<=2*n;i++)
{
sum[i]=sum[i-1]+a[i];
}
for(i=2*n-1;i>=1;i--)
{
for(j=i+1;j<i+n&&j<=2*n;j++)
{
dpm[i][j]=inf;
for(k=i;k<j;k++)
{
dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]);// đây là trọng điểm
dpm[i][j]=min(dpm[i][j],dpm[i][k]+dpm[k+1][j]+sum[j]-sum[i-1]);
}
}
}
intmaxx=-1,minn=inf;
for(i=1;i<=n;i++)//n cái khu gian giá trị tiến hành tương đối
{
maxx=max(maxx,dp[i][i+n-1]);
minn=min(minn,dpm[i][i+n-1]);
}
cout<<minn<<endl;
cout<<maxx<<endl;
return0;
}