您的位置:首页 > 其它

CDOJ 1131 男神的礼物 石子合并

2016-04-01 12:42 211 查看
代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
using namespace std;
int dp[100][100][2];
void max(int a, int b);
int main()
{
int T, n, a;
scanf("%d", &T);
while (T--)
{
memset(dp, -1, sizeof(dp));
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &a);
dp[i][i][0] = a;
dp[i][i][1] = 0;
}
for (int r = 1; r < n; r++)
{
for (int l = r - 1; l >= 0; l--)
{
for (int k = l; k < r; k++)
{
if (dp[l][r][1] == -1)
{
dp[l][r][1] = dp[l][k][0] * dp[k + 1][r][0] + dp[l][k][1] + dp[k + 1][r][1];
dp[l][r][0] = (dp[l][k][0] + dp[k + 1][r][0]) % 100;
}
else if (dp[l][r][1] > (dp[l][k][0] * dp[k + 1][r][0] + dp[l][k][1] + dp[k + 1][r][1]))
{
dp[l][r][1] = dp[l][k][0] * dp[k + 1][r][0] + dp[l][k][1] + dp[k + 1][r][1];
dp[l][r][0] = (dp[l][k][0] + dp[k + 1][r][0]) % 100;
}
else if (dp[l][r][1] == (dp[l][k][0] * dp[k + 1][r][0] + dp[l][k][1] + dp[k + 1][r][1]))
{
if (dp[l][r][0] > ((dp[l][k][0] + dp[k + 1][r][0]) % 100))
{
dp[l][r][0] = (dp[l][k][0] + dp[k + 1][r][0]) % 100;
}
}
}
}
}
printf("%d\n", dp[0][n - 1][1]);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: