题目链接:https://ac.nowcoder.com/acm/contest/903/C 题目大意: 思路:直接枚举攻打点,分成两个区间,进行分治就行了。记忆化递归。
#include<bits/stdc++.h>
#define LL long long
using namespace std
;
const int maxn
=2e5+10;
LL a
[105];
LL dp
[105][105];
LL
dfs(int L
, int R
)
{
if(dp
[L
][R
]!=-1)
{
return dp
[L
][R
];
}
if(R
<=L
)
{
return 0;
}
LL ans
=((LL
)1<<63)-1;
for(int i
=L
;i
<=R
;i
++)
{
ans
=min(ans
, dfs(L
, i
-1)+dfs(i
+1, R
)+(R
-L
)*a
[i
]);
}
return dp
[L
][R
]=ans
;
}
int main()
{
int t
;
scanf("%d",&t
);
while(t
--)
{
int n
;
memset(dp
, -1, sizeof(dp
));
scanf("%d",&n
);
for(int i
=1;i
<=n
;i
++)
{
scanf("%d",&a
[i
]);
}
printf("%lld\n",dfs(1, n
));
}
return 0;
}
转载请注明原文地址: https://yun.8miu.com/read-113728.html