POJ 1179 Polygon 기억화 dfs vs dp
#include <iostream>
#include <cstdio>
#include <memory.h>
using namespace std;
const int maxn = 52;
int dpmax[maxn][maxn][2],dpmin[maxn][maxn][2],num[maxn],edge[maxn];
bool vis[maxn][maxn][2];
int n;
inline int MAX(int a,int b)
{
return a > b ? a : b;
}
inline int MIN(int a,int b)
{
return a < b ? a : b;
}
void read()
{
memset(vis,false,sizeof(vis));
char str[3];
for(int i=0;i<n;i++)
{
scanf("%s %d",str,&num[i]);
if(str[0] == 't') edge[i] = 0;
else edge[i] = 1;
}
return;
}
int dfs(int st,int to,int d)
{
if(vis[st][to][d])
{
return dpmax[st][to][d];
}
if(st == to)
{
vis[st][to][d] = true;
return dpmax[st][to][d] = dpmin[st][to][d] = num[st];
}
if(d == 0)
{
bool flag = false;
int resma , resmi;
for(int i=st;i<to;i++)
{
int le = dfs(st , i , 0);
int ll = dpmin[st][i][0];
int ri = dfs(i+1 , to , 0);
int rr = dpmin[i+1][to][0];
int addma = MAX(MAX(le + ri , le + rr) , MAX(ll + ri , ll + rr));
int mulma = MAX(MAX(le * ri , le * rr) , MAX(ll * ri , ll * rr));
int addmi = MIN(MIN(le + ri , le + rr) , MIN(ll + ri , ll + rr));
int mulmi = MIN(MIN(le * ri , le * rr) , MIN(ll * ri , ll * rr));
int tma = edge[i+1] ? mulma : addma;
int tmi = edge[i+1] ? mulmi : addmi;
if(flag == false)
{
flag = true;
resma = tma;
resmi = tmi;
}
else
{
resma = MAX(resma , tma);
resmi = MIN(resmi , tmi);
}
}
vis[st][to][d] = true;
dpmin[st][to][d] = resmi;
return dpmax[st][to][d] = resma;
}
else
{
bool flag = false;
int resma , resmi , le , ri , ll , rr;
for(int i=st;i != to;)
{
int j = (i - 1 + n) % n;
if(i <= st)
{
le = dfs(i , st , 0);
ll = dpmin[i][st][0];
}
else
{
le = dfs(st , i , 1);
ll = dpmin[st][i][1];
}
if(j >= to)
{
ri = dfs(to , j , 0);
rr = dpmin[to][j][0];
}
else
{
ri = dfs(j , to , 1);
rr = dpmin[j][to][1];
}
int addma = MAX(MAX(le + ri , le + rr) , MAX(ll + ri , ll + rr));
int mulma = MAX(MAX(le * ri , le * rr) , MAX(ll * ri , ll * rr));
int addmi = MIN(MIN(le + ri , le + rr) , MIN(ll + ri , ll + rr));
int mulmi = MIN(MIN(le * ri , le * rr) , MIN(ll * ri , ll * rr));
int tma = edge[i] ? mulma : addma;
int tmi = edge[i] ? mulmi : addmi;
if(flag == false)
{
flag = true;
resma = tma;
resmi = tmi;
}
else
{
resma = MAX(resma , tma);
resmi = MIN(resmi , tmi);
}
i = j;
}
vis[st][to][d] = true;
dpmin[st][to][d] = resmi;
return dpmax[st][to][d] = resma;
}
}
void solve()
{
int res = dfs(0 , n-1 , 0);
for(int i=0;i<n-1;i++)
{
res = MAX(res , dfs(i , i+1 , 1));
}
printf("%d
",res);
bool flag = false;
if(dpmax[0][n-1][0] == res)
{
printf("1 ");
}
for(int i=0;i<n-1;i++)
{
if(dpmax[i][i+1][1] == res)
{
printf("%d ",i+2);
}
}
printf("
");
return;
}
int main()
{
while(~scanf("%d",&n))
{
read();
solve();
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.