状态:f [ i ][ j ]表示前i个点换了j次的最小和
转移:用f [ i ][ j ]更新f [ i+1 ][ j+k-i-1](k为i后一点)
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int n,k,s; int a[200]; int f[200][200*200]; int main() { scanf("%d %d %d",&n,&k,&s); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } memset(f,0x3f,sizeof(f)); f[0][0]=0; for(int i=1;i<=n;i++) { for(int j=i-1;j>=0;j--) { for(int k=0;k<=i*j;k++)//把i前j个点全部换入最左j个点最多需要i*j次 { if(f[j][k]!=0x3f3f3f3f) { f[j+1][k+i-j-1]=min(f[j+1][k+i-j-1],f[j][k]+a[i]); } } } } int ans=0x3f3f3f3f; for(int i=0;i<=min(s,n*n);i++) { ans=min(ans,f[k][i]); } printf("%dn",ans); }
最后
以上就是玩命大白最近收集整理的关于codeforces 590D Top Secret Task(dp)的全部内容,更多相关codeforces内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复