美文网首页
Uva(1169)(Robotruck)

Uva(1169)(Robotruck)

作者: kimoyami | 来源:发表于2018-08-09 11:42 被阅读0次

链接:https://vjudge.net/problem/UVA-1169
思路:啊啊啊啊啊啊太开心了,刚刚上一道题觉得很难,这道题我用刘汝佳上道题的思路写感觉比他的解还要简单一点,很开心。首先找出状态,我们定义dp[i][j]为当前机器人站在第i个垃圾上且已经捡起了第i个垃圾后手上的重量为j,那么我们要考虑下一步操作,回去把垃圾倒掉或者继续捡垃圾,继续捡垃圾的条件是必须捡起下一个垃圾后手上重量小于等于最大可承受重量,那么就可以分为两步进行递归,最后取最小值(用记忆式搜索会比递推好写且更好理解)
代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;

struct point{
    int x,y,w;
}pp[100001];

int dp[100001][101];
int t,c,n;

int dfs(int i,int j){
    if(dp[i][j]!=0)return dp[i][j];//如果有值的话则代表已经计算过
    int& ans = dp[i][j];//引用的技巧,一定要学会,非常好用
    if(i==n){//到最后一个垃圾且已经捡起来了,则可以返回了
        ans+=pp[i].x+pp[i].y;
        return ans;
    }
    if(j+pp[i+1].w<=c){//决策一,捡下一个垃圾
    ans+=(fabs(pp[i].x-pp[i+1].x)+fabs(pp[i+1].y-pp[i].y));
    ans+=dfs(i+1,j+pp[i+1].w);
    }
    else ans = 1e9;//一定不能少这一步,不然如果不满足决策1条件此时ans为0,下一步则会被最后min给覆盖掉!!!!
//决策2,先回去再回来捡垃圾
    int sum = pp[i].x+pp[i].y+pp[i+1].x+pp[i+1].y;
    sum+=dfs(i+1,pp[i+1].w);
    ans = min(ans,sum);//取所需步数较小的一个即可
    return ans;
}

int main(){
    scanf("%d",&t);
    while(t--){
        memset(dp,0,sizeof(dp));
        scanf("%d%d",&c,&n);
        pp[0].x = pp[0].y = pp[0].w = 0;
        for(int i=1;i<=n;++i){
            scanf("%d%d%d",&pp[i].x,&pp[i].y,&pp[i].w);
        }
    printf("%d\n",dfs(0,0));
    if(t)printf("\n");//注意输出格式,uva上格式是真的蛋疼!
    }
    return 0;
}

好吧,原来是老刘觉得我的方法要超时所以用了优化,暂时看不懂写贴上来吧


Uva(1169)(Robotruck)
Uva(1169)(Robotruck)

相关文章

  • Uva(1169)(Robotruck)

    链接:https://vjudge.net/problem/UVA-1169思路:啊啊啊啊啊啊太开心了,刚刚上一道...

  • 素数练习题

    UVA 10375 UVA 10791 UVA10375 Choose and divide 题解 先素数打表,然...

  • 有趣的数学题

    UVA12716 UVA11582 UVA12716 GCD XOR 题解 参考这题用到2个结论a ^ b = c...

  • 1169

    这是一件今后想起来不会让我后悔的事情,那我就义无反顾去做。

  • 1169

    “有些东西,真的是曾经不管怎么哭得双眼通红,怎么求得头破血流都还是得不到,可是如今即便是你笑脸相迎,亲自双手奉送给...

  • 字典树

    UVA 11488题目链接https://uva.onlinejudge.org/index.php?option...

  • ACM 国内外几个网站 & 题目分类

    国外 西班牙Valladolid大学 Uva:https://uva.onlinejudge.org俄罗斯Ural...

  • 皮肤科学小知识:

    对皮肤造成损伤的紫外线主要是UVB和UVA。 UVA能穿透玻璃对皮肤的穿透能力也比较强,可以深达真皮,UVA的生物...

  • ACM刷题打卡-151215

    UVa 272 - TEX Quotes 水题。字符替换。 UVa 10082 - WERTYU 第一次提交WA,...

  • 美肤mini课堂之防晒的理论知识

    1、关于UVA和UVB UVB是波短的紫外线,威力次于UVA,只能晒到表皮层,能把皮肤晒红、晒伤;UVA是波长的紫...

网友评论

      本文标题:Uva(1169)(Robotruck)

      本文链接:https://www.haomeiwen.com/subject/zyuqbftx.html