POJ 1179 Polygon (DP)

16638 단어 poj
제목: 다각형을 정하고 정점을 정할 때 숫자, 변은 조작이다. 한 변을 없애면 가장 큰 숫자가 얼마인지 물어보고 이런 상황을 출력한다.
이 문제는 매트릭스 체인 상승의 변체로 dp로 하면 되지만 두 음수 상승도 가장 클 수 있으니 한 상태의 최대수와 최소수를 모두 기억하고 마지막으로 최대수를 찾으면 된다.
 

  
    
#include < iostream >
#include
< cstdio >
#include
< memory.h >
using namespace std;

#define MAXN 100
struct Node{
int mmax;
int mmin;
}f[MAXN][MAXN];

int func( const int & a, const int & b, const char & o)
{
if (o == ' t ' )
return a + b;
else
return a * b;
}
int main()
{
char op[MAXN];
int arr[MAXN];
int n,i,j,mmin,mmax,k,h,tmp,st,en,mid1,mid2,mark_pos;
while (scanf( " %d " , & n) != EOF)
{
for (i = 0 ;i < n; ++ i)
{
getchar();
op[i]
= getchar();
scanf(
" %d " , & arr[i]);
}
for (i = 0 ;i < n; ++ i)
{
f[i][i].mmax
= arr[i];
f[i][i].mmin
= arr[i];
}
for (k = 1 ;k < n; ++ k)
for (i = 0 ;i < n; ++ i)
{
mmin
= 1 << 30 ;
mmax
= - mmin;
en
= (i + k) % n;
for (j = 0 ;j < k; ++ j)
{
mid1
= (i + j) % n;
mid2
= (i + j + 1 ) % n;
tmp
= func(f[i][mid1].mmin,f[mid2][en].mmin,op[mid2]);
mmax
= mmax > tmp ? mmax:tmp;
tmp
= func(f[i][mid1].mmax,f[mid2][en].mmax,op[mid2]);
mmax
= mmax > tmp ? mmax:tmp;
tmp
= func(f[i][mid1].mmin,f[mid2][en].mmax,op[mid2]);
mmin
= mmin < tmp ? mmin:tmp;
tmp
= func(f[i][mid1].mmax,f[mid2][en].mmin,op[mid2]);
mmin
= mmin < tmp ? mmin:tmp;
}
f[i][en].mmax
= mmax;
f[i][en].mmin
= mmin;
}
mmax
= - ( 1 << 30 );
for (i = 0 ;i < n; ++ i)
{
en
= (i + n - 1 ) % n;
if (mmax < f[i][en].mmax)
{
mark_pos
= i;
mmax
= f[i][en].mmax;
}

}
printf(
" %d
" ,mmax);
int flag = 0 ;
for (i = 0 ;i < n; ++ i)
{
if (f[i][(i + n - 1 ) % n].mmax == mmax)
{
if ( ! flag)
{
flag
= 1 ;
printf(
" %d " ,i + 1 );
}
else
printf(
" %d " ,i + 1 );
}
}
printf(
"
" );
}
return 0 ;
}

좋은 웹페이지 즐겨찾기