CodeForces 711C.Coloring Trees【DP】
2016-08-30 01:03
489 查看
题目链接
http://codeforces.com/problemset/problem/711/C思路
设dp[i][x][l]代表涂完前i棵树,美丽值为x,最后一棵树的颜色为l的最小代价。那么
for each 1<=c<=m
若第i棵树没颜色
dp[i][x+1][c]=min(dp[i][x+1][c],dp[i-1][x][l]+p[i][c]) , if c!=l
dp[i][x][c]=min(dp[i][x][c],dp[i-1][x][l]+p[i][c]), if c==l
否则
dp[i][x+1][a[i]]=min(dp[i][x+1][a[i]],dp[i-1][x][l]), if c!=l
dp[i][x][a[i]]=min(dp[i][x][a[i]],dp[i-1][x][l]), if c==l
一开始初始化为INF即可。
比赛的手抽时候把一个m打成了n,竟然还过了pretest,改了就过了,心痛啊。
果然还是要细心细心再细心。
AC代码
#include <bits/stdc++.h> #include <cstring> using namespace std; typedef long long ll; int a[200]; ll dp[110][110][110]; ll p[200][200]; const ll INF=0x3f3f3f3f3f3f3f3f; int main() { memset(dp,0x3f3f3f3f,sizeof(dp)); int n,m,k; scanf("%d%d%d",&n,&m,&k); for(int i=1 ; i<=n ; ++i) { scanf("%d",&a[i]); } for(int i=1 ; i<=n ; ++i) { for(int j=1 ; j<=m ; ++j) { scanf("%I64d",&p[i][j]); } } if(a[1])dp[1][1][a[1]]=0; else { for(int c=1 ; c<=m ; ++c) { dp[1][1][c]=p[1][c]; } } for(int i=2 ; i<=n ; ++i)if(a[i]==0) { for(int x=1 ; x<i ; ++x) { for(int c=1 ; c<=m ; ++c) { for(int 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(int x=1 ; x<i ; ++x) { for(int l=1 ; l<=m ; ++l) { if(l!=a[i])dp[i][x+1][a[i]]=min(dp[i][x+1][a[i]],dp[i-1][x][l]); else dp[i][x][a[i]]=min(dp[i][x][a[i]],dp[i-1][x][l]); } } } ll ans=INF; for(int c=1 ; c<=m ; ++c) { ans=min(ans,dp [k][c]); } if(ans==INF)printf("-1\n"); else printf("%I64d\n",ans); return 0; }
相关文章推荐
- 简单的四则运算
- 数的奇偶性
- ACMer博客瀑布流分析
- ACM程序设计大赛题目分类
- 2015年acm国内排名
- 计算字符串最后一个单词长度
- ACM网址
- 1272 小希的迷宫
- 1272 小希的迷宫
- hdu 1250 大数相加并用数组储存
- 矩阵的乘法操作
- 蚂蚁爬行问题
- 蚂蚁爬行问题
- 求两个数的最大公约数【ACM基础题】
- 打印出二进制中所有1的位置
- 杭电题目---一只小蜜蜂
- HDOJ 1002 A + B Problem II (Big Numbers Addition)
- 初学ACM - 半数集(Half Set)问题 NOJ 1010 / FOJ 1207
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1002