动态规划法求解多边形游戏
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法分析与设计实验报告
第次实验
五边形测试:
附录:完整代码
#include
#include
#include
#include
#include
#define num 50
using namespace std;
int m[num][num][2],s[num][num];
int Polymax(int n,int v[],char op[]) {
int i,j,k,s1,r;
int min[num],max[num],maxf;
int e[4];
for(i=1;i<=n;i++)
m[i][1][0]=m[i][1][1]=v[i];
for(j=2;j<=n;j++)
for(i=1;i<=n;i++)
{
for(s1=1;s1<=j-1;s1++)
{
r=(i+s1-1)%n+1;
if(op[(i+s1)%n]=='+')
{
min[s1]=m[i][s1][0]+m[r][j-s1][0];
max[s1]=m[i][s1][1]+m[r][j-s1][1];
}
else
{
e[0]=(m[i][s1][0])*(m[r][j-s1][0]);
e[1]=(m[i][s1][0])*(m[r][j-s1][1]);
e[2]=(m[i][s1][1])*(m[r][j-s1][0]);
e[3]=(m[i][s1][1])*(m[r][j-s1][1]);
min[s1]=e[0];
max[s1]=e[0];
for(k=1;k<4;k++)
{
if(min[s1]>e[k])
min[s1]=e[k];
if(max[s1] max[s1]=e[k]; } } } m[i][j][0]=min[1];m[i][j][1]=max[1]; for(k=2;k<=j-1;k++) { if(m[i][j][0]>min[k])//计算首次删去第i条边的得分 m[i][j][0]=min[k]; if(m[i][j][1] { m[i][j][1]=max[k]; s[i][j]=s1; } } } maxf=m[1][n][1]; //首次删去第1条边的最大得分 for(i=2;i<=n;i++)//首次删去第i条边的最大得分 { if(maxf } return maxf; } int main( ) { int i,p=0; double k=0.0; clock_t start,end,over; start=clock(); end=clock(); over=end-start; start=clock(); int n,max; int v[50]; char op[50]; cout<<"--------动态规划法--多边形游戏-----------"< cout<<"请输入边数n:"; cin>>n; cout<<"请依次输入符号和顶点:"< for(i=1;i<=n;i++) { cin>>op[i]>>v[i]; getchar(); } max=Polymax(n,v,op); cout< for(i=0;i<1000000000;i++) p=p+i; end=clock(); printf("The time is %6.3f",(double)(end-start-over)/CLK_TCK); return 0; }