【动态规划】Codeforces 711C Coloring Trees

来源:互联网 发布:淘宝卖家购买淘金币 编辑:程序博客网 时间:2024/06/01 08:16

题目链接:

  http://codeforces.com/problemset/problem/711/C

题目大意:

  给N棵树,M种颜色,已经有颜色的不能涂色,没颜色为0,可以涂色,每棵树I涂成颜色J花费PIJ。求分成K个颜色段(1112221为3个颜色段)的最小花费。无解输出-1.

题目思路:

  【动态规划】

  f[i][j][k]表示前i个树分成j段,最后一个颜色是k的花费。

  根据当前这棵树是否可以涂色,上一棵树是否可以涂色转移。

  直接枚举这个树和上棵树的颜色,N4居然没T。 




////by coolxxx//#include<bits/stdc++.h>#include<iostream>#include<algorithm>#include<string>#include<iomanip>#include<map>#include<stack>#include<queue>#include<set>#include<bitset>#include<memory.h>#include<time.h>#include<stdio.h>#include<stdlib.h>#include<string.h>//#include<stdbool.h>#include<math.h>#define min(a,b) ((a)<(b)?(a):(b))#define max(a,b) ((a)>(b)?(a):(b))#define abs(a) ((a)>0?(a):(-(a)))#define lowbit(a) (a&(-a))#define sqr(a) ((a)*(a))#define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))#define mem(a,b) memset(a,b,sizeof(a))#define eps (1e-8)#define J 10#define mod 1000000007#define MAX 0x7f7f7f7f#define PI 3.14159265358979323#define N 104using namespace std;typedef long long LL;int cas,cass;int n,m,lll,ans;int c[N];LL aans;LL a[N][N];LL f[N][N][N];int main(){#ifndef ONLINE_JUDGE//freopen("1.txt","r",stdin);//freopen("2.txt","w",stdout);#endifint i,j,k,l;//for(scanf("%d",&cass);cass;cass--)//for(scanf("%d",&cas),cass=1;cass<=cas;cass++)//while(~scanf("%s",s+1))while(~scanf("%d",&n)){scanf("%d%d",&m,&cas);for(i=1;i<=n;i++)scanf("%d",&c[i]);for(i=1;i<=n;i++)for(j=1;j<=m;j++)scanf("%I64d",&a[i][j]);mem(f,0x7f);c[0]=m+1,f[0][0][m+1]=0;for(i=1;i<=n;i++){if(c[i]!=0){if(c[i-1]!=0){for(j=1;j<=min(i,cas);j++){if(c[i]!=c[i-1])f[i][j][c[i]]=min(f[i][j][c[i]],f[i-1][j-1][c[i-1]]);else f[i][j][c[i]]=min(f[i][j][c[i]],f[i-1][j][c[i-1]]);}}else//c[i]!=0 c[i-1]=0{for(j=1;j<=min(i,cas);j++){for(k=1;k<=m;k++){if(k!=c[i])f[i][j][c[i]]=min(f[i][j][c[i]],f[i-1][j-1][k]);else f[i][j][c[i]]=min(f[i][j][c[i]],f[i-1][j][k]);}}}}else if(c[i-1]==0)//c[i]=0{for(j=1;j<=min(i,cas);j++){for(k=1;k<=m;k++){for(l=1;l<=m;l++){if(l==k)f[i][j][k]=min(f[i][j][k],f[i-1][j][l]+a[i][k]);else f[i][j][k]=min(f[i][j][k],f[i-1][j-1][l]+a[i][k]);}}}}else//c[i]=0,c[i-1]!=0{for(j=1;j<=min(i,cas);j++){for(k=1;k<=m;k++){if(k!=c[i-1])f[i][j][k]=min(f[i][j][k],f[i-1][j-1][c[i-1]]+a[i][k]);else f[i][j][k]=min(f[i][j][k],f[i-1][j][c[i-1]]+a[i][k]);}}}}aans=f[0][0][0];for(i=1;i<=m;i++)aans=min(aans,f[n][cas][i]);if(aans==f[0][0][0])puts("-1");else printf("%I64d\n",aans);}return 0;}/*////*/


0 0
原创粉丝点击