sicily 1176 (动态规划)

题目连接:sicily 1176

解题思路:

题目看上去像是一道博弈的题,又像是一道区间型DP的题目(矩阵取数),而它跟矩阵取数的区别就是他是两个人在取数,所以每次对一个区间,我们应分两种情况考虑:第一个人取左边的数和取右边的数,而在分别考虑这两种情况时,我们又要根据贪心法则来获取上一个取数的区间。状态方程有点复杂,直接上代码了:

// Problem#: 1176
// Submission#: 3601655
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
// All Copyright reserved by Informatic Lab of Sun Yat-sen University
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f

using namespace std;

int n,a[1005],dp[1005][1005];

int main()
{
    int t=1;
    while(~scanf("%d",&n)&&n)
    {
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);

        memset(dp,-INF,sizeof(dp));
        for(int len=2;len<=n;len+=2)
        {
            for(int i=1;i<=n-len+1;i++)
            {
                int j=i+len-1;
                if(j-i==1)
                    dp[i][j]=max(a[i],a[i+1])-min(a[i],a[i+1]);
                else
                {
                    int tmp;
                    if(a[i+1]>=a[j])//取左边的数
                        tmp=dp[i+2][j]+a[i]-a[i+1];
                    else
                        tmp=dp[i+1][j-1]+a[i]-a[j];
                    dp[i][j]=tmp;    

                    if(a[i]>=a[j-1])//取右边的数
                        tmp=dp[i+1][j-1]+a[j]-a[i];
                    else
                        tmp=dp[i][j-2]+a[j]-a[j-1];
                    dp[i][j]=max(dp[i][j],tmp);
                }
            }
        }
        printf("In game %d, the greedy strategy might lose by as many as %d points.\n",t++,dp[1][n]);
    }

    return 0;
}                                 

总结:

其实是一道用动态规划的思想来做博弈的题目,可以借鉴矩阵取数。

时间: 2024-10-13 12:04:06

sicily 1176 (动态规划)的相关文章

sicily 1176. Two Ends (Top-down 动态规划+记忆化搜索 v.s. Bottom-up 动态规划)

DescriptionIn the two-player game "Two Ends", an even number of cards is laid out in a row. On each card, face up, is written a positive integer. Players take turns removing a card from either end of the row and placing the card in their pile. T

sicily 1176 two ends 动态规划解题

1176. Two Ends Constraints Time Limit: 1 secs, Memory Limit: 64 MB Description In the two-player game "Two Ends", an even number of cards is laid out in a row. On each card, face up, is written a positive integer. Players take turns removing a c

Sicily 1176 Two Ends

1176. Two Ends Constraints Time Limit: 1 secs, Memory Limit: 64 MB Description In the two-player game "Two Ends", an even number of cards is laid out in a row. On each card, face up, is written a positive integer. Players take turns removing a c

编程题目分类(剪辑)

1. 编程入门 2. 数据结构 3. 字符串 4. 排序 5. 图遍历 6. 图算法 7. 搜索:剪枝,启发式搜索 8. 动态规划/递推 9. 分治/递归 10. 贪心 11. 模拟 12. 算术与代数 13. 组合问题 14. 数论 15. 网格,几何,计算几何 [编程入门] PC 110101, uva 100, The 3n+1 problem, 难度 1 PC 110102, uva 10189, Minesweeper, 难度 1 PC 110103, uva 10137, The T

sicily 1419(动态规划)

题目链接:sicily 1419 解题思路:(一道稍微有点不一样的动态规划题目) 刚开始看到题目就立马想到一种动规的解法,用dp[i][j]表示第 i 个到达第 j 个点,可是这种做法有一个问题--推导下一个点的时候需要用到再上一个点的数据(因为越慢送的牛奶需要花费越多时间),这样时间复杂度就会达到o( n^3 ),必然超时,于是我们可以看出,要解这道题,要解决两个问题: 1)首先要搜遍所有的数据可能性:2)可以求得最终的总时间 这两个问题,想了好久,发现自己傻逼了-- 1)为了使总时间最小,那

Hdoj 1176 免费馅饼 【动态规划】

免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 26110    Accepted Submission(s): 8905 Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的1

sicily 1264(动态规划)

题目链接:sicily 1264 解题思路: 状态挺好想的(详见代码),但是得看透这题计算时间开销的本质--预处理,把所有时间开销的可能性处理处理,剩下的就简单了~ 代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int n,a[105],r; double b,v,e,f,dis[10005],dp[

HDU 1176 免费馅饼 好像是简单的动态规划吧

题目链接~~http://acm.hdu.edu.cn/showproblem.php?pid=1176 刚开始数组越界,RT了两回     %>_<%   在坐标上要注意j-1时 代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <algorithm> 5 using namespace std; 6 7 #define max(a,b) (a

HDU 1176 免费馅饼 简单动态规划

世道很简单的动态规划,但是却错了,让我很无语,改来改去还是不对,第二天有写就对了,之后我就耐着性子慢慢比较之前的错误代码,发现 第一次错:纯粹用了a[i][j]+=max3(a[i+1][j-1], a[i+1][j], a[i+1][j+1]);没有考虑j为0没有a[i+1][j-1]的存在和j为10时没有a[i+1][j+1]的存在 第二次错:我纠正了第一次的错误,把j为0和10单独考虑,这是数塔类型,我是自下向上推得,所以行数应该从最大的时间m=t:m-1开始的,但我写的是m,我感觉应该没