AcWing 1027. 方格取数

打印 上一主题 下一主题

主题 552|帖子 552|积分 1656

  1. 题意等价于:选择两条从A到B的路径,路径上的点对答案至多贡献一次,求最大值
  2. 很容易想到先计算第一条路径,再计算第二条路径(f[i1][j1][i2][j2]),判断重合的点,但这样没有利用重合点的必要性,有时间和空间上的冗余
  3. 进一步想到,每对重合点的横纵坐标之和必定相等
  4. 也就是说只有当i1 + j1 == i2 + j2时,两条路径上的点才有可能重合,这就是我们要特殊处理的情况
  5. 不妨设k = i1+j1,这样枚举的状态就从四维降到了三维,只需计算状态f[k][i1][i2]即可(两点重合等价于i1 == i2)
复制代码

[code]#includeusing namespace std;#define int long long#define fr first#define se secondtypedef pair PII;typedef unsigned long long ULL;const int INF = 0X3f3f3f3f, N = 20, MOD = 1e9 + 10;int w[N][N];int f[2*N][N][N];void work() {    int n;    cin>>n;        int a,b,c;    while(cin>>a>>b>>c,a||b||c) w[a]=c;    for(int k=2;k

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

科技颠覆者

金牌会员
这个人很懒什么都没写!

标签云

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