百度空间 | 百度首页 
 
查看文章
 
多边形游戏_动态规划
2008-10-14 11:14 P.M.
      多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形。每个顶点被赋予一个整数值,每条边被赋予一个运算符“+”或“*”。所有边依次用整数从1到n编号。
游戏第1步,将一条边删除。
随后n-1步按以下方式操作:
(1) 选择一条边E以及由E连接着的两个顶点V1和V2;
(2) 用一个新的顶点取代边E以及由E连接着的两个顶点V1和V2。将由顶点V1和V2的整数值通过边E上的运算得到的结果赋予新顶点。
最后,所有边都被删除,游戏结束。游戏的得分就是所剩顶点上的整数值。

问题:对于给定的多边形,计算最高得分。

C++代码:

#include <stdio.h>
#include <iostream>
using namespace std;
#define n 4
int m[n][n][2];
int minf,maxf;
char op[n];

void minMax(int i,int s,int j)
{
   
int e[5];
int a=m[i][s][0],
b=m[i][s][1],
r=(i+s-1)%n+1,
c=m[r][j-s][0],
d=m[r][j-s][1];

if(op[r]=='+')
{
   minf=a+c;
   maxf=b+d;
}
else
{
   e[1]=a*c;
   e[2]=a*d;
   e[3]=b*c;
   e[4]=b*d;
   minf=e[1];
   maxf=e[1];
   for(int k=2;k<5;k++)
   {
    if(minf>e[k])
     minf=e[k];
    if(maxf<e[k])
     maxf=e[k];
   }
}

}


int polyMax()
{
for(int j=2;j<=n;j++)
   for(int i=1;i<=n;i++)
     for(int s=1;s<j;s++)
   {
    minMax(i,s,j);
   
    if(m[i][j][0]>minf)
     m[i][j][0]=minf;
    if(m[i][j][1]<maxf)
     m[i][j][1]=maxf;
   }
int temp=m[1][n][1];
for(int i=2;i<=n;i++)
{
   if(temp<m[i][n][1])
    temp=m[i][n][1];
}
return temp;
  
}

void main()
{
cout<<"输入[]op"<<endl;

for(int k=1;k<=n;k++)
{
   cin>>op[k];
}

cout<<"输入各顶点的值"<<endl;//m[i][1][0]的初始值为各顶点的值

for(int i=1;i<=n;i++)
{
   cin>>m[i][1][0];
   m[i][1][1]=m[i][1][0];
}

cout<<"该多边形能得到的最大值是:"<<endl;
cout<<polyMax();
system("pause");

}


类别:课程相关 | 添加到搜藏 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu