首页 > 代码库 > codeforces 711C dp
codeforces 711C dp
一眼dp,但是这道题不知怎么搞遇到点小问题,又搞了搞才出来,就是给你一些颜色。这个点有颜色,不能图,反之可以。问形成k段连续颜色的最小花费。
纯纯的dp,不知道为什么就是有问题。。。终于借鉴了别人的A过了,后面再研究吧。
#include <cstdio>#include <cstring>#include <vector>#include <cmath>#include <stack>#include <cstdlib>#include <queue>#include <map>#include <iostream>#include <algorithm>#include <bits/stdc++.h>using namespace std;typedef long long LL;LL dp[110][110][110];LL p[210][210];LL a[110];LL inf=0x7f7f7f7f;int main(){ LL n,m,k; scanf ("%I64d%I64d%I64d",&n,&m,&k); for (LL i=1;i<=n;i++) { scanf ("%I64d",&a[i]); } for (LL i=1;i<=n;i++) { for (LL j=1;j<=m;j++) { scanf ("%I64d",&p[i][j]); } } memset(dp,inf,sizeof(dp)); if (a[1]) { dp[1][1][a[1]]=0; } else { for (LL i=1;i<=m;i++) { dp[1][1][i]=p[1][i]; } } for (LL i=2;i<=n;i++) { if (!a[i]) { for (LL x=1;x<i;x++) { for (LL c=1;c<=m;c++) { for (LL l=1;l<=m;l++) { if (l!=c) dp[i][x+1][c]=min(dp[i][x+1][c],dp[i-1][x][l]+p[i][c]); else dp[i][x][c]=min(dp[i][x][c],dp[i-1][x][l]+p[i][c]); } } } } else { for (LL x=1;x<i;x++) { for (LL l=1;l<=m;l++) { if (l==a[i]) dp[i][x][a[i]]=min(dp[i][x][a[i]],dp[i-1][x][a[i]]); else dp[i][x+1][a[i]]=min(dp[i][x+1][a[i]],dp[i-1][x][l]); } } } } LL ans=inf; for (LL i=1;i<=m;i++) { ans=min(dp[n][k][i],ans); } if (ans==inf) ans=-1; printf ("%I64d\n",ans); return 0;}
codeforces 711C dp
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。