2067 小兔的棋盘【dp】【记忆化搜索dfs】

本文探讨了从小兔的棋盘起点到终点的路径计数问题,在不穿越对角线的条件下,通过动态规划(DP)及记忆化搜索两种方法求解路径数,并提供了完整的代码实现。

小兔的棋盘

Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6193 Accepted Submission(s): 3373


Problem Description
小兔的叔叔从外面旅游回来给她带来了一个礼物,小兔高兴地跑回自己的房间,拆开一看是一个棋盘,小兔有所失望。不过没过几天发现了棋盘的好玩之处。从起点(0,0)走到终点(n,n)的最短路径数是C(2n,n),现在小兔又想如果不穿越对角线(但可接触对角线上的格点),这样的路径数有多少?小兔想了很长时间都没想出来,现在想请你帮助小兔解决这个问题,对于你来说应该不难吧!

Input
每次输入一个数n(1<=n<=35),当n等于-1时结束输入。

Output
对于每个输入数据输出路径数,具体格式看Sample。

Sample Input
1 3 12 -1

Sample Output
1 1 2 2 3 10 3 12 416024



思路:
       简单dp, 因为是求最短,所以当前状态只能由上面或者左面过来(上半部分三角形),由于不能过对角线,我们可以只求一半,也就是上面三角形,最后乘2就行了,直接dp打表,或者记忆化搜索,对于记忆化搜索也可以1边记忆化搜索打表,就是最后在转换矩阵,终点变成了起点,起点变终点什么的,不难,我下面的是dp打表,和直接记忆化搜索的代码,记忆化搜索打表的没写,想写的直接在记忆或搜索的那个改改就行了。


dp

#include<stdio.h>
#include<string.h>

__int64 dp[40][40] = {0};

void solve(int n)
{
   dp[1][1] = 1;
   for(int i = 1 ;i <= n ;i ++)
   for(int j = i ;j <= n ;j ++)
   {  
      if(i == 1 && j == 1) continue;
      dp[i][j] = dp[i][j-1] + dp[i-1][j];
   }
}

int main ()
{
   int n ,cas = 1;
   solve(36);
   while(~scanf("%d" ,&n) && n != -1)
   {
      printf("%d %d %I64d\n" ,cas ++ ,n ,dp[n+1][n+1] * 2);
   }
   return 0;
}

记忆化搜索


#include<stdio.h>
#include<string.h>

int mark[40][40];
__int64 dp[40][40];
int n;

__int64 DFS(int x ,int y)
{
   if(x == n + 1 && y == n + 1) return 1;
   if(mark[x][y]) return dp[x][y];
   __int64 sum = 0;
   if(x + 1 <= n + 1 && x + 1 <= y)
   sum += DFS(x + 1 ,y);
   if(y + 1 <= n + 1)
   sum += DFS(x ,y + 1);
   mark[x][y] = 1;
   dp[x][y] = sum;
   return sum;
}

int main ()
{
   memset(mark ,0 ,sizeof(mark));
   int cas = 1;
   while(scanf("%d" ,&n) && n != -1)
   {
      memset(mark ,0 ,sizeof(mark));
      printf("%d %d %I64d\n" ,cas ++ ,n ,DFS(1 ,1) * 2);
   }
   return 0;
}
     
### 小兔鲜电商自动化测试方案 #### 自动化测试框架的选择 对于小兔鲜这样的电商项目,可以选择基于 **Selenium WebDriver** 或者 **Cypress** 的自动化测试框架来实现功能测试。这些工具支持多种编程语言,并能够很好地集成到现有的开发环境中[^1]。 如果团队已经熟悉 Python,则可以考虑使用 Selenium 和 unittest 结合的方式构建测试框架。unittest 提供了一个结构化的环境来编写和执行单元测试,而 Selenium 可以模拟浏览器行为完成端到端的功能验证[^4]。 另一种选择是 Cypress,它专为现代 Web 应用程序设计,具有更快的运行速度以及更友好的调试体验。由于小兔鲜采用了 Vue3 技术栈,因此 Cypress 是一个非常合适的选择[^5]。 #### 测试工具推荐 以下是几种适合该场景下的测试工具: 1. **Selenium**: 支持跨平台、多浏览器兼容性测试;通过 Python 编写脚本配合 unittest 使用。 2. **Cypress**: 更加现代化的 JavaScript 工具链成员之一,特别适用于单页面应用 (SPA),如基于 Vue.js 构建的小兔鲜项目。 3. **Playwright**: 类似于 Puppeteer 但提供了更好的稳定性及性能表现,同样也适配 Node.js 生态圈内的技术需求。 4. **Postman / Newman**: 主要针对 API 层面接口调用逻辑进行覆盖检测,在处理像 “获取订单列表” 这样的后台服务交互时尤为有效[^3]. #### 示例代码片段 - 使用 Selenium 实现简单登录测试 下面是一个简单的例子展示了如何利用 Selenium 完成对用户登录流程的基础验证: ```python from selenium import webdriver import unittest class LoginTest(unittest.TestCase): @classmethod def setUpClass(cls): cls.driver = webdriver.Chrome() cls.base_url = 'https://example.com/login' def test_login_success(self): self.driver.get(self.base_url) username_field = self.driver.find_element_by_id('username') password_field = self.driver.find_element_by_id('password') submit_button = self.driver.find_element_by_css_selector('.submit-btn') # 输入用户名密码并提交表单 username_field.send_keys('test_user') password_field.send_keys('secure_password!') submit_button.click() welcome_message = self.driver.find_element_by_tag_name('h1').text self.assertEqual(welcome_message, 'Welcome back!') @classmethod def tearDownClass(cls): cls.driver.quit() if __name__ == '__main__': unittest.main() ``` 此段代码演示了如何创建一个继承自 `unittest.TestCase` 的类来进行基本的操作序列描述,并最终断言期望的结果是否满足条件[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值