Codeforces #590D: Top Secret Task 题解
来源:互联网 发布:linux怎么用vi创建文件 编辑:程序博客网 时间:2024/05/17 07:54
这题显然的是dp
设计状态dp[u][i][j]为在前i个数中进行操作,swap次数不超过j次,前i个数的和最小是多少
对于第u个元素:
如果不将它放进前i个:dp[u][i][j]=dp[u-1][i][j]
如果将它放进前i个,一个显然的结论是,要使得交换次数最少,本来在序列中靠前的那些数最后在前i个数中也应靠前
所以应该将第u个数放在第i个,dp[u][i][j]=dp[u-1][i-1][j-(u-i)]
两者取min即可
注意要用滚动数组防超空间
(PS:下面的代码交上去死活WA在test1,然而样例是过的,在网上找了一个AC程序拍了一遍,应该是对的)
#include <bits/stdc++.h>#define x first#define y second#define mp make_pair#define pb push_back#define LL long long#define ld long double#define Pair pair<int,int>#define LOWBIT(x) x & (-x)using namespace std;const int INF=0x7ffffff;const int MOD=1e9+7;int dp[2][155][30000];int n,k,s;int a[200],sum[200];int main (){//freopen ("test.in","r",stdin);//freopen ("test.out","w",stdout);int u,i,j;scanf("%d%d%d",&n,&k,&s);for (i=1;i<=n;i++) scanf("%d",&a[i]);int p1=0,p2=1;int ans=INF;for (i=1;i<=min(u,k);i++)for (j=0;j<=min(s,n*n);j++)dp[p2][i][j]=a[1];swap(p1,p2);for (u=2;u<=n;u++){for (i=1;i<=min(u,k);i++)for (j=0;j<=min(s,n*n);j++){dp[p2][i][j]=INF;if (u>i) dp[p2][i][j]=dp[p1][i][j];if (j-(u-i)>=0) dp[p2][i][j]=min(dp[p2][i][j],dp[p1][i-1][j-(u-i)]+a[u]);if (i==k && (j==n*n || j==s)) ans=min(ans,dp[p2][i][j]);}swap(p1,p2);}printf("%d\n",ans);return 0;}
反思:设计dp状态的时候,设置为“不超过i”而不是“正好是i”dp时可以省一维度
阅读全文
1 0
- Codeforces #590D: Top Secret Task 题解
- codeforces 590D Top Secret Task(dp)
- Codeforces 590D Top Secret Task
- 【DP】 cf 590D Top Secret Task
- Codeforces Round #327 (Div. 1) D. Top Secret Task(DP)
- CF 590D Top Secret Task【dp递推+滚动数组】【好题】
- Codeforces Round #310 (Div. 1) D. Case of a Top Secret 二分 stl应用
- Codeforces 190D Non-Secret Cypher
- codeforces 594D题解
- Codeforces 431 D. Random Task
- [Codeforces Round #310 DIV1D (CF555D)] Case of a Top Secret
- CF 70D Professor's task题解
- codeforces D. Ice Sculptures 题解
- Codeforces 325D Reclamation 题解
- Codeforces 475D CGCDSSQ 题解
- Codeforces-417D总结&题解
- CodeForces Round #120 (190D) - Non-Secret Cypher
- codeforces 190D Non-Secret Cypher(two pointers)
- JAVA_1 异常处理
- 数组和列表的区别
- B
- 机器学习笔记之代价函数
- android sensor 框架分析---服务端
- Codeforces #590D: Top Secret Task 题解
- 10个重要的算法C语言实现源代码:拉格朗日,牛顿插值,高斯,龙贝格,牛顿迭代,牛顿-科特斯,雅克比,秦九昭,幂法,高斯塞德尔
- 面向对象(内部类的使用)
- linux 下的文件搜索、可执行文件搜索
- 剑指offer | 训练题61:二叉树搜索的第K个结点
- js call()方法
- SpringSecurity学习笔记(一) 核心类与接口
- 华为机试,字符串最后一个单词的长度
- jquery中$("#id")与document.getElementById("id")的区别与联系