最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

Topcodersrm653div.21000

来源:动视网 责编:小采 时间:2020-11-09 07:39:18
文档

Topcodersrm653div.21000

Topcodersrm653div.21000:题意: 给出一个序列,请你找出两个没有交且并为全集的子序列,使得每个子序列相邻两位之间的数字差的绝对之和最 题意: 给出一个序列,请你找出两个没有交且并为全集的子序列,使得每个子序列相邻两位之间的数字差的绝对值之和最小。 思路: DP..
推荐度:
导读Topcodersrm653div.21000:题意: 给出一个序列,请你找出两个没有交且并为全集的子序列,使得每个子序列相邻两位之间的数字差的绝对之和最 题意: 给出一个序列,请你找出两个没有交且并为全集的子序列,使得每个子序列相邻两位之间的数字差的绝对值之和最小。 思路: DP..


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

题意:

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

思路:

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 
 #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<=(h);++i)
 #define FORD(i,h,l) for(i=(h);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]-pitch[j-1]);
 }
 dp[2][1] = 0;
 for(int i = 3; i <= len; ++i) {
 for(int j = 1; j < i; ++j) {
 if(i - j > 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;
 }

文档

Topcodersrm653div.21000

Topcodersrm653div.21000:题意: 给出一个序列,请你找出两个没有交且并为全集的子序列,使得每个子序列相邻两位之间的数字差的绝对之和最 题意: 给出一个序列,请你找出两个没有交且并为全集的子序列,使得每个子序列相邻两位之间的数字差的绝对值之和最小。 思路: DP..
推荐度:
标签: 1000 题意 srm
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top