算法竞赛进阶指南- I-country


int func1(vector<vector<int>> &mat,int K)
{
	int m = mat.size();
	int n = mat[0].size();

	int dp[4][9][3][3][2][2];
	for (int i = 0; i <= m; i++)dp[i][0][0][0][1][0] = 0;

	for (int i = 1; i <= m; i++)
	{
		for (int j = 0; j < m*n; j++)
		{
			for (int l = 0; l < n; l++)
			{
				for (int r = l; r < n; r++)
				{
					int value = 0;
					for (int k = l; k <= r; k++)value += mat[i-1][k];

					//1
					if (j == r - l + 1){
						dp[i][j][l][r][1][0] = dp[i - 1][0][0][0][1][0] + value;
					}
					else if (j>r - l + 1){
						for (int p = l; p <= r; p++)
						{
							for (int q = p; q <= r; q++){
								dp[i][j][l][r][1][0] = max(dp[i][j][l][r][1][0],
									dp[i - 1][j - r + l - 1][p][q][1][0] + value);
							}
						}
					}

					//2
					if (j >= r - l + 1){
						for (int p = l; p <= r; p++)
						{
							for (int q = r; q < n; q++){
								for (int y = 0; y <= 1; y++){
									dp[i][j][l][r][1][1] = max(dp[i][j][l][r][1][1],
										dp[i - 1][j - r + l - 1][p][q][1][y] + value);
								}
							}
						}
					}


					//3
					if (j >= r - l + 1){
						for (int p = 0; p <= l; p++)
						{
							for (int q = l; q <= r; q++){
								for (int x = 0; x <= 1; x++){
									dp[i][j][l][r][0][0] = max(dp[i][j][l][r][0][0],
										dp[i - 1][j - r + l - 1][p][q][x][0] + value);
								}
							}
						}
					}


					//4
					if (j >= r - l + 1){
						for (int p = 0; p <= l; p++)
						{
							for (int q = r; q < n; q++){
								for (int x = 0; x <= 1; x++){
									for (int y = 0; y <= 1; y++){
										dp[i][j][l][r][0][1] = max(dp[i][j][l][r][0][1],
											dp[i - 1][j - r + l - 1][p][q][x][y] + value);
									}
								}
							}
						}
					}

				}
			}
		}
	}
	int mx = 0;
	for (int i = 1; i <= m; i++){
		for (int l = 0; l < n; l++)
		{
			for (int r = l; r < n; r++)
			{
				for (int x = 0; x <= 1; x++){
					for (int y = 0; y <= 1; y++){
						mx = max(mx, dp[i][K][l][r][x][y]);
					}
				}
			}
		}
	}
	return mx;

}


int main() 
{


	vector<vector<int> > a = { { -1, 2, -2 }, { 3, 2, -1 }, { 4, 3, 3 } };
	int res = func1(a,6);

	cout << res << endl;

	system("pause");
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值