过河

来源:互联网 发布:艾瑞排名 数据雷达 编辑:程序博客网 时间:2024/05/06 02:37

http://www.rqnoj.cn/Problem_17.html

一、思路

刚开始什么也不想,简单动态规划 40个得分点

后面加上了空间的优化:

每次计算其实只需T+1个长度的数组来记忆,所以就用了伪循环队列

利用i % (T+1) hash实现

还是40个得分点

 

时间优化:

f[i] = min( f[i-t] ,f[i-t+1]...f[i-s])+del[i] 其中i为石子时del[i] = 1 否则为0

f[i]的改变就在于它这个位置是否有石子,以及它前t->s的状态

如果两个石子的距离大于了T,那么第a[i],和a[i+1]之间的石子状态将相同

 

如果S==T 那么要单独处理,否则还是L*M  a[i]%s ==0

 

s=2 t=3 l=100

 3  10

1 3 5   2  3 2 2 2 2 2

0 1 2   3  4 5 6 7 8 9

所以可以直接跳至下一个石子位置

90个得分点

#include <iostream.h>#define MAX_INT 999int delTa(int * a, int m, int k){int i=0;for (i=0; i<m; i++){if (k==a[i]) {return 1;}}if (i>=m) {return 0;}}int main(){    int i, j, l, s, t, m;int *a, *f;int beg;int p = 0;cin>>l>>s>>t>>m;a = new int[m];f = new int [t+1];//读入石子for (i=0; i<m; i++){cin>>a[i];}//冒泡排序石子for (i=1; i<m; i++){for (j=0; j<m-i; j++){if (a[j] > a[j+1]){a[j] = a[j] + a[j+1];a[j+1] = a[j] - a[j+1];a[j] = a[j] - a[j+1];}}}if (s==t){j = 0;for (i=0; i<m; i++){if (a[i] % s == 0){j++;}}cout<<j;return 0;}f[0] = 0;for (i=1; i<l+t; i++){int pos = i%(t+1);int del;//int del = delTa(a, m, i);        if (i<a[p]) {if (p-1>=0 && i>a[p-1]+t){i = a[p]-1;continue;}else{del = 0;}//del = 0;}else if (i==a[p]){del = 1;}else {p = p+1<m ? p+1 : m-1;if (i==a[p]){del = 1;}else  if (i>a[p-1]+t && i<a[p]){i = a[p]-1;continue;}else if (i>a[p]+t && i<l){i = l-1;continue;}else{del = 0;}}f[pos] = MAX_INT;    for (j=s; j<=t; j++){int forePos = (i-j) % (t+1);if (i-j>=0 && f[pos]>f[forePos] + del){f[pos] =  f[forePos] + del;}}//cout<<i<<':'<<f[i%(t+1)]<<' ';}j = MAX_INT;for (i=l; i<l+t; i++){if (j>f[i%(t+1)]){j = f[i%(t+1)];}}cout<<j;delete []a;delete []f;return 0;}

 

省下的那个得分点错在了哪里?

1、原先的伪循环队列有点hash意思,如果从1-L,那么不会出现重叠

但是如果时间优化就是调到下个石子可能会出现这种情况

0 1 2  本该填充第3个,可是如果下个石子是42 那么会覆盖第2个,那这样为什么还会有90个得分点?

 

s=2 t=3 l=100

 3  10

1 3 5   2  3 2 2 2 2 2

0 1 2   3  4 5 6 7 8 9

 

想了想 会不会这种

2 3 2    然后新的石子刚好覆盖的是

2 3 3 那么紧接着的最小就会认为是3而不是2

 

所以把间隔调大些试试

把 i>a[p-1] + t 改为了 i>a[p-1] + 2*t

AC

#include <iostream.h>#define MAX_INT 999int delTa(int * a, int m, int k){int i=0;for (i=0; i<m; i++){if (k==a[i]) {return 1;}}if (i>=m) {return 0;}}int main(){    int i, j, l, s, t, m;int *a, *f;int beg;int p = 0;cin>>l>>s>>t>>m;a = new int[m];f = new int [t+1];//读入石子for (i=0; i<m; i++){cin>>a[i];}//冒泡排序石子for (i=1; i<m; i++){for (j=0; j<m-i; j++){if (a[j] > a[j+1]){a[j] = a[j] + a[j+1];a[j+1] = a[j] - a[j+1];a[j] = a[j] - a[j+1];}}}if (s==t){j = 0;for (i=0; i<m; i++){if (a[i] % s == 0){j++;}}cout<<j;return 0;}f[0] = 0;for (i=1; i<l+t; i++){int pos = i%(t+1);int del;//int del = delTa(a, m, i);        if (i<a[p]) {if (p-1>=0 && i>a[p-1]+2*t){i = a[p]-1;continue;}else{del = 0;}//del = 0;}else if (i==a[p]){del = 1;}else {p = p+1<m ? p+1 : m-1;if (i==a[p]){del = 1;}else  if (i>a[p-1]+2*t && i<a[p]){i = a[p]-1;continue;}else if (i>a[p]+2*t && i<l){i = l-1;continue;}else{del = 0;}}f[pos] = MAX_INT;    for (j=s; j<=t; j++){int forePos = (i-j) % (t+1);if (i-j>=0 && f[pos]>f[forePos] + del){f[pos] =  f[forePos] + del;}}//cout<<i<<':'<<f[i%(t+1)]<<' ';}j = MAX_INT;for (i=l; i<l+t; i++){if (j>f[i%(t+1)]){j = f[i%(t+1)];}}cout<<j;delete []a;delete []f;return 0;}


 

自己弄的复杂了,呵呵 后面再理理

 

 


 

 

   
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孕牙龈肿痛出血怎么办 孕期牙龈肿痛出血怎么办 牙龈肿痛还出血怎么办 上牙龈肿痛出血怎么办 孕妇牙龈肿痛出血怎么办 牙痛一个月不好怎么办 肛裂一个月没好怎么办 哺乳期便血肛裂怎么办 哺乳期肛裂严重怎么办 哺乳期肛裂出血怎么办 哺乳期痔疮肛裂怎么办 肛裂屁股疼怎么办 哺乳期肛裂了怎么办 肛裂疼起来真要命!怎么办? 肛裂出血疼怎么办 痔疮火辣辣的疼怎么办 学生小腹部突出怎么办 去北海玩下雨怎么办 抓嫖异地传唤怎么办 头顶太尖不好看怎么办 受到家暴离婚怎么办 被电打了身体痛怎么办 被电麻了手臂痛怎么办 被电伤之后很痛怎么办 电旱打眼睛红痛怎么办 从心底厌恶老公怎么办 欠债还不起了怎么办 生孩子先破羊水怎么办 丈夫网贷妻子怎么办 丈夫不能包容妻子怎么办 丈夫卷钱跑了 妻子怎么办 白色鞋子染色了怎么办 真丝衣服起静电怎么办 新买的网鞋太硬怎么办 运动鞋鞋面太硬怎么办 仙人球的刺扎进肉里面怎么办 军人优先被拒绝怎么办 晋江小说防盗章怎么办 小说设置了防盗怎么办 军训帽子太小怎么办 电脑不显示桌面图标怎么办