UVa 10564 DP Paths through the Hourglass

本文介绍了一种使用动态规划解决特定网格中路径数量的问题,并找到达到目标和的字典序最小路径的方法。代码实现采用C++,通过三维数组记录到达每个格子且满足路径和条件的不同路径的数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从下往上DP,d(i, j, k)表示第(i, j)个格子走到底和为k的路径条数。

至于字典序最小,DP的时候记录一下路径就好。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 int n, sum;
 7 int a[50][25];
 8 long long d[50][50][550];
 9 int p[50][50][550][2];
10 
11 int main()
12 {
13     while(scanf("%d%d", &n, &sum) == 2 && n)
14     {
15         memset(d, 0, sizeof(d));
16         memset(p, 0, sizeof(p));
17         for(int i = 1; i <= n; i++)
18             for(int j = 1; j <= n - i + 1; j++) scanf("%d", &a[i][j]);
19         for(int i = n + 1; i < n * 2; i++)
20             for(int j = 1; j <= i - n + 1; j++) scanf("%d", &a[i][j]);
21 
22         for(int i = 1; i <= n; i++)
23         {
24             int t = a[n*2-1][i];
25             d[n*2-1][i][t] = 1;
26         }
27 
28         for(int i = n*2-2; i >= n; i--)
29             for(int j = 1; j <= i - n + 1; j++)
30                 for(int k = a[i][j]; k <= sum; k++)
31                 {
32                     int t = k - a[i][j];
33                     if(d[i+1][j][t]) { d[i][j][k] += d[i+1][j][t]; p[i][j][k][0] = 1; }
34                     if(d[i+1][j+1][t]) { d[i][j][k] += d[i+1][j+1][t]; p[i][j][k][1] = 1; }
35                 }
36 
37         for(int i = n - 1; i >= 1; i--)
38             for(int j = 1; j <= n - i + 1; j++)
39                 for(int k = a[i][j]; k <= sum; k++)
40                 {
41                     int t = k - a[i][j];
42                     if(d[i+1][j-1][t]) { d[i][j][k] += d[i+1][j-1][t]; p[i][j][k][0] = 1; }
43                     if(d[i+1][j][t]) { d[i][j][k] += d[i+1][j][t]; p[i][j][k][1] = 1; }
44                 }
45 
46         long long ans = 0;
47         for(int i = 1; i <= n; i++) ans += d[1][i][sum];
48         printf("%lld\n", ans);
49         if(!ans) { puts(""); continue; }
50 
51         int j, now = sum;
52         for(int i = 1; i <= n; i++) if(d[1][i][sum]) { j = i; break; }
53         printf("%d ", j - 1);
54 
55         for(int i = 1; i < n * 2 - 1; i++)
56         {
57             if(p[i][j][now][0])
58             {
59                 printf("L");
60                 now -= a[i][j];
61                 if(i < n) j--;
62             }
63             else
64             {
65                 printf("R");
66                 now -= a[i][j];
67                 if(i >= n) j++;
68             }
69         }
70         puts("");
71     }
72 
73     return 0;
74 }
代码君

 

还有一件事想抽自己两巴掌,就是一直困惑我的谜之AC,谜之WA,是因为没关freopen,WTF!

转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/4726432.html

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值