P1063エネルギーのネックレス
サンプル入力と出力
入力#1
4 2 3 5 10
出力#1
710
説明/ヒント
グループ最初の質問を向上させるためにNOIP 2006
思考
石のような質問を組み合わせて、その値は、あなたは少し変更してもらいます。
石二山を組み合わせることができ、それぞれ(I、K)、(K + 1、j)が存在する場合、値はヘッド[I] *尾[K] *尾[J]について得られました。
その後、同じような石はそれを行うマージ。
コード
#include
<
ビット/ STDC ++。H
>
#define
DBG(
X
)
COUT
<<
#X
<<
"
=
"
<<
X
<<
ENDL
#defineは
epsは
1個の
電子を
-
8
#define
パイ
ACOS(
-
1.0
)
使用して
名前空間
はstdを
、
typedef
long
long LL
;
const
int inf
=
0x
3f3f3f3f
;
template
<
class T
>
inline
void
read(T
&
res
)
{
char c
;T flag
=
1
;
while((c
=
getchar())
<
'
0
'
||c
>
'
9
'
)if(c
==
'
-
'
)flag
=-
1
;res
=c
-
'
0
'
;
while((c
=
getchar())
>=
'
0
'
&&c
<=
'
9
'
)res
=res
*
10
+c
-
'
0
'
;res
*=flag
;
}
namespace _buff
{
const
size_t BUFF
=
1
<<
19
;
char
ibuf
[BUFF
],
*ib
= ibuf
,
*ie
= ibuf
;
char
getc()
{
if
(ib
== ie
)
{
ib
= ibuf
;
ie
= ibuf
+
fread(ibuf
,
1
, BUFF
, stdin
);
}
return ib
== ie
?
-
1
:
*ib
++
;
}
}
int
qread()
{
using
namespace _buff
;
int ret
=
0
;
bool pos
=
true
;
char c
=
getc();
for
(;
(c
<
'
0
'
|| c
>
'
9
'
)
&& c
!=
'
-
'
; c
=
getc())
{
assert(
~c
);
}
if
(c
==
'
-
'
)
{
pos
=
false
;
c
=
getc();
}
for
(; c
>=
'
0
'
&& c
<=
'
9
'
; c
=
getc())
{
ret
=
(ret
<<
3
)
+
(ret
<<
1
)
+
(c
^
48
);
}
return pos
? ret
:
-ret
;
}
const
int maxn
=
307
;
int n
;
int
head
[maxn
];
int
tail
[maxn
];
int
f
[maxn
][maxn
];
int
main()
{
read(n
);
for
(
int i
=
1
; i
<= n
;
++i
)
{
read(
head
[i
]);
head
[n
+ i
]
=
head
[i
];
}
for
(
int i
=
1
; i
<=
2
* n
-
1
;
++i
)
{
tail
[i
]
=
head
[i
+
1
];
}
int ans
=
-
1
;
tail
[
2
* n
]
=
head
[
1
];
for
(
int z
=
1
; z
<= n
-
1
;
++z
)
{
//!枚举区间长度
for
(
int i
=
1
; i
<=
2
* n
- z
;
++i
)
{
int j
= i
+ z
;
for
(
int k
= i
; k
<= j
-
1
;
++k
)
{
f
[i
][j
]
=
max(
f
[i
][j
],
f
[i
][k
]
+
f
[k
+
1
][j
]
+
head
[i
]
*
tail
[k
]
*
tail
[j
]);
ans
=
max(ans
,
f
[i
][j
]);
}
}
}
cout
<< ans
<< endl
;
return
0
;
}