您的位置:首页 > 编程语言 > Go语言

poj 1179 Polygon

2015-06-25 23:57 579 查看
利用dp解决问题,除了dp中的首位的状态,每种中间的状态有对应两种情况:相邻元素相加或者相邻元素相乘。操作过程中,额外的数组记录中间过程步骤。

#include<iostream>
#include<string.h>
#include<math.h>
#include<fstream>
#include<algorithm>
#include<stdio.h>
#include<queue>
#include<vector>
#define MAXSIZE 100
using namespace std;

int tnum[110], num[55];
char tsym[110], sym[55];
int dmax[55][55], dmin[55][55];

const int mi = 1993111700;
inline int calc (int a, int b, char sy)
{
if (sy == 't') return a + b;
else return a * b;
}

int main ()
{
//freopen("data_1179.txt","r",stdin);
int n; char ar[5];
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%s", ar);
tsym[i] = tsym[i + n] = ar[0];
int x; scanf("%d", &x);
tnum[i] = tnum[i + n] = x;
}
int res = -mi, ans[55], ansmr = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++) num[j] = tnum[i + j];
for (int j = 0; j < n - 1; j++) sym[j] = tsym[i + j + 1];
for (int j = 0; j < n; j++) dmax[j][j] = dmin[j][j] = num[j];
for (int len = 2; len <= n; len++)
{
for (int j = 0; j + len <= n; j++)
{
int k = j + len - 1;
dmax[j][k] = -mi, dmin[j][k] = mi;
for (int u = j; u < k; u++)
{
dmax[j][k] = max(dmax[j][k], calc(dmax[j][u], dmax[u + 1][k], sym[u]));
dmax[j][k] = max(dmax[j][k], calc(dmin[j][u], dmax[u + 1][k], sym[u]));
dmax[j][k] = max(dmax[j][k], calc(dmax[j][u], dmin[u + 1][k], sym[u]));
dmax[j][k] = max(dmax[j][k], calc(dmin[j][u], dmin[u + 1][k], sym[u]));
dmin[j][k] = min(dmin[j][k], calc(dmax[j][u], dmax[u + 1][k], sym[u]));
dmin[j][k] = min(dmin[j][k], calc(dmin[j][u], dmax[u + 1][k], sym[u]));
dmin[j][k] = min(dmin[j][k], calc(dmax[j][u], dmin[u + 1][k], sym[u]));
dmin[j][k] = min(dmin[j][k], calc(dmin[j][u], dmin[u + 1][k], sym[u]));
}
}
}
if (dmax[0][n - 1] > res) res = dmax[0][n - 1], ans[0] = i, ansmr = 1;
else if (dmax[0][n - 1] == res) ans[ansmr++] = i;
}
printf("%d\n%d", res, ans[0] + 1);
for (int i = 1; i < ansmr; i++) printf(" %d", ans[i] + 1); printf("\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: