吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2503|回复: 3
收起左侧

[C&C++ 转载] 四维动态规划

[复制链接]
KaQqi 发表于 2019-5-1 17:24
本帖最后由 KaQqi 于 2019-5-4 16:14 编辑

四维dp
题目:
https://www.luogu.org/problemnew/show/P1004

代码:
[C++] 纯文本查看 复制代码
#include <stdio.h>

int calculateMax(int a,int b,int c,int d)
{
        if(a>=b && a>=c && a>=d) return a;
        if(b>=a && b>=c && b>=d) return b;
        if(c>=b && c>=a && c>=d) return c;
        if(d>=b && d>=c && d>=a) return d;
}

int main()
{
        int n;
        int data[10][10];//用于储存输入的数组
        int dp[10][10][10][10];//dp数组用于记录两个人从a走到这的最大值
        for(int i = 0;i<10;i++)//初始化数组
        {
                for (int j = 0;j<10;j++)
                {
                        data[i][j] = 0;
                        for(int k=0;k<10;k++)
                        {
                                for (int l = 0;l<10;l++)
                                {
                                        dp[i][j][k][l] = 0;
                                }
                        }
                }
        }
        scanf("%d",&n);
        while(1)//输入
        {
                int horizontal;
                int vertical;
                int num;
                scanf("%d%d%d",&horizontal,&vertical,&num);
                if(horizontal == 0&&vertical==0&&num==0) break;
                data[horizontal][vertical] = num;
                
        }
        for(int i=1;i<=n;i++)//第一个人
        {
                for(int j=1;j<=n;j++)
                {
                        for(int k=1;k<=n;k++)//第二个人
                        {
                                for(int l=1;l<=n;l++)
                                {
                                        if(i==k&&j==l)//如果两个人路径一样,那么就只加一个人的就行了
                                        {
                                                dp[i][j][k][l]=calculateMax(dp[i-1][j][k-1][l],dp[i][j-1][k-1][l],dp[i-1][j][k][l-1],dp[i][j-1][k][l-1])+data[i][j];
                                                continue;
                                        }
                                        dp[i][j][k][l]=calculateMax(dp[i-1][j][k-1][l],dp[i][j-1][k-1][l],dp[i-1][j][k][l-1],dp[i][j-1][k][l-1])+data[i][j]+data[k][l];
                                        
                                }
                        }
                }
        }
        printf("%d",dp[n][n][n][n]);
        return 0;
}


P1006跟这道题有点像,也是四维dp。。
https://www.luogu.org/problemnew/show/P1006
[Asm] 纯文本查看 复制代码
#include <stdio.h>

int calculateMax(int a,int b,int c,int d)
{
	if(a>=b && a>=c && a>=d) return a;
	if(b>=a && b>=c && b>=d) return b;
	if(c>=b && c>=a && c>=d) return c;
	if(d>=b && d>=c && d>=a) return d;
}

int data[51][51];
int dp[51][51][51][51];//两条路的好心程度大小
int main()
{
	int m,n;
	scanf("%d %d",&m,&n);
	for(int i = 1;i<=m;i++)
	{
		for (int j = 1;j<=n;j++)
		{
			scanf("%d",&data[i][j]);
		}
	}
	for(int i = 1;i<=m;i++)
	{
		for (int j = 1;j<=n;j++)
		{
			for (int k = 1;k<=m;k++)
			{
				for (int l = 1;l<=n;l++)
				{
					if(i == k && j == l)
					{
						dp[i][j][i][j] = calculateMax(dp[i-1][j][k-1][l],dp[i][j-1][k-1][l],dp[i-1][j][k][l-1],dp[i][j-1][k][l-1])+data[i][j];
						continue;
					}
					dp[i][j][k][l]=calculateMax(dp[i-1][j][k-1][l],dp[i][j-1][k-1][l],dp[i-1][j][k][l-1],dp[i][j-1][k][l-1])+data[i][j]+data[k][l];	
				}
			}
		}
	}
	printf("%d",dp[m][n][m][n]);
	return 0;
}


Ps:dp好难理解,还是用我大dfs的枚举好

免费评分

参与人数 2吾爱币 +8 热心值 +2 收起 理由
苏紫方璇 + 5 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
涛之雨 + 3 + 1 行了行了。。。cb热心都给你了。。。看不懂。。

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

quaternion 发表于 2019-5-1 17:35
这是什么  能详细说下吗?
苏紫方璇 发表于 2019-5-4 16:54
一脸懵逼的进来,一脸懵逼的出去,

免费评分

参与人数 1吾爱币 +3 热心值 +1 收起 理由
KaQqi + 3 + 1 1

查看全部评分

 楼主| KaQqi 发表于 2019-5-4 17:41
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 07:46

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表