重庆一中Vijos 【训练题】步步为零 P1428 题解
2014-10-19 12:10
134 查看
题解:
此题是一道比较简单的一道动态规划题目设状态转移方程时容易想到的是 d[i,j] = 从最下面一格走到(i,j)的最佳值,但这样定义显然行不通,因为“最佳值”定义得太抽象,没办法描述。
所以应该定义为:d[i,j,k] = 从最下面一格走到(i,j)经过一系列加减拿到k可不可行。
但是此题的方程比较繁琐,要分两种情况,这里不细说了,大家可以在代码的第70-90行去看。
在做这道题的时候我遇到了一个问题,就是ready(0函数计算所有和的值的时候,在第40行。
一开始j没有初始化我就在使用,其实是一个笔误,我本来准备写1的。在本机上完全可以测试通过,但交上题库总是内存越界,最上面的check我就是写来检查越界的。遗憾的是check没有检查到任何错误,
因为在我的编译器上j被初始化了…………最后我把程序一小段一小段的交到题库上才发现是这里错了,调了接近一个小时…………orz
代码:
#define MAXN 35#define MAXL 6010
#define ADD 3005
#define dp(i,j,k) d[(i)][(j)][(k)+ADD]
#define check if(i>=MAXN+MAXN || i<0 || j<0 || j>=MAXN || k+ADD<0 || k+ADD>=MAXL)throw "add error"
#include
#include
#include
using namespace std;
int d[MAXN+MAXN][MAXN][MAXL];
int a[MAXN+MAXN][MAXN];
int N;
int tot;
void input()
{
int i,j;
scanf("%d",&N);
for(i=1;i<=N;i++)
for(j=1;j<=i;j++)
scanf("%d",&a[i][j]);
for(i=N-1;i>0;i--)
for(j=1;j<=i;j++)
scanf("%d",&a[N+N-i][j]);
}
void ready()
{
int i,j,max,k=0;
memset(d,0,sizeof(d));
dp(N+N-1,1,a[N+N-1][1]) = 1;
tot = 0;
for(i=1;i<=N;i++)
{
max = a[i][1]; //开始写的max = a[i][j]; 教训啊教训
for(j=1;j<=i;j++)
{
check;
if(a[i][j]>max)max = a[i][j];
}
tot += max;
}
for(i=N-1;i>0;i--)
{
max = a[N+N-i][1];
for(j=1;j<=i;j++)
{
check;
if(a[N+N-i][j]>max)max = a[N+N-i][j];
}
tot += max;
}
}
void work()
{
int i,j,k;
for(i=N+N-2;i>=N;i--)
{
for(j=1;j<=N+N-i;j++)
{
for(k=-tot;k<=tot;k++)
{
check;
dp(i,j,k) = dp(i+1,j, k-a[i][j]) ||
dp(i+1,j, k+a[i][j]) ||
dp(i+1,j-1,k-a[i][j]) ||
dp(i+1,j-1,k+a[i][j]);
}
}
}
for(;i>=1;i--)
{
for(j=1;j<=i;j++)
{
for(k=-tot;k<=tot;k++)
{
check;
dp(i,j,k) = dp(i+1,j, k-a[i][j]) ||
dp(i+1,j, k+a[i][j]) ||
dp(i+1,j+1,k-a[i][j]) ||
dp(i+1,j+1,k+a[i][j]);
}
}
}
}
void output()
{
int i,j=0,k=0;
for(i=0;;i++)
{
if(dp(1,1,i) || dp(1,1,-i))break;
check;
}
printf("%d\n",i);
}
int main()
{
freopen("in.txt","r",stdin);
input();
ready();
work();
output();
return 0;
}
题目描述:
题目网站【训练题】步步为零 | ||||
| ||||
|
相关文章推荐
- vijos1037 搭建双塔(重庆一中高2018级信息学竞赛测验7) 解题报告
- Vijos P1428 贪婪格尔曼
- vijos训练之——星辰大海中闪烁的趣题
- Vijos - 1060 盒子 递推+优化 重庆一中高2018级竞赛班第七次测试 2016.8.4 Problem 1
- vijos1060 盒子(重庆一中高2018级信息学竞赛测验7) 解题报告
- Vijos - 1037 搭建双塔 动态规划(DP) 重庆一中高2018级竞赛班第七次测试 2016.8.4 Problem 2
- vijos1488 路灯改建计划(重庆一中高2018级信息学竞赛测验9) 解题报告
- Vijos - 1488 路灯的改建计划 动态规划 重庆一中高2018级竞赛班第九次测试 2016.9.10 Problem 3
- Vijos训练计划 1-1 计数问题
- 重庆一中Vijos 【训练题】花店橱窗布置 P1426
- 训练大脑,让你生产力更高的七个窍门
- caffe测试已经训练好的模型的迭代次数修改
- 算法训练 K好数
- SDAU训练日志第23篇----------搜索与查找二分hdu练习(1)(2018年3月16日)
- 关于一些Python的一些基础语法训练
- 微软开源认知服务CNTK的测试(语音训练)
- 算法训练 数的统计
- 蓝桥杯 VIP 算法训练 Pyramids (55分)Java程序代码
- 软件工程课堂训练——结对开发Ⅱ
- dlib人脸训练和关键点检测