• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Topcoder srm 653 div.2 1000

mysql 搞代码 4年前 (2022-01-09) 21次浏览 已收录 0个评论

题意: 给出一个序列,请你找出两个没有交且并为全集的子序列,使得每个子序列相邻两位之间的数字差的绝对之和最

题意:

给出一个序列,请你找出两个没有交且并为全集的子序列,使得每个子序列相邻两位之间的数字差的绝对值之和最小。

思路:

DP….(dp弱渣, 折腾了好久请教了人才会>,<..

dp[i][j] 表示一人最后一个取的位置是i, 一人最后一个取的位置是j.

分两种情况:

1.i-j>1: dp[i][j] = dp[i-1][j] + abs(pitch[i-2]-pitch[i-1]) 让A一直取数..

2.i-j=1: 1) A只取i, 其他的都给B.

2)A取j, 枚举A上一次取的位置k,B取i, 上一次取k: res = min(res, dp[j][k] + abs(pitch[i-1]-pitch[k-1]))

理解: 两个人会把其中一个位置当做他取的最后一个位置, 那另一个人取的最后一个位置就是最后一个数了. 可以先想比如只有3个人, 这样写是可以把所有的情况涵盖的,相当于问题的子问题.

AC.

    #line 7 "SingingEasy.cpp"    #include     #include     #include     #include     #include     #include     #include     #include     #include     #include     #include <map>    #include     #include     #include     #include     #include     #include     #include     #include     #include     #include     #include     #include     using namespace std;    #define PB push_back    #define MP make_pair    #define REP(i,n) for(i=0;i<(n);++i)    #define FOR(i,l,h) for(i=(l);i=(l);--i)    typedef vector VI;    typedef vector VS;    typedef vector VD;    typedef long long LL;    typedef pair PII;    int dp[2005][2005];    class SingingEasy    {            public:            int solve(vector  pitch)            {                int len = pitch.size();                if(len <= 2) return 0;                dp[1][0] = 0;                for(int j = 2; j <= len; ++j) {                    dp[j][0] = dp[j-1][0] + abs(pitch[j-2]-pitc<mark>本文来源gaodaimacom搞#^代%!码&网(</mark>h[j-1]);                }                dp[2][1] = 0;                for(int i = 3; i <= len; ++i) {                    for(int j = 1; j <i> 1) {                            dp[i][j] = dp[i-1][j] + abs(pitch[i-2]-pitch[i-1]);                        }                        else {                            int res = 1e9+5;                            for(int k = 1; k < j; ++k) {                                res = min(res, dp[j][k] + abs(pitch[i-1]-pitch[k-1]));                            }                            dp[i][j] = min(res, dp[j][0]);                        }                    }                }                int ans = dp[len][0];                for(int i = 1; i < len; ++i) {                    ans = min(ans, dp[len][i]);                }                return ans;            }

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Topcoder srm 653 div.2 1000

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址