UVALive 6853(dp)
2018-06-17 23:45:43来源:未知 阅读 ()
题意:已知有n个城市,某歌手每月进行一场演唱会,共持续c个月,可连续两个月在同一个城市。城市间的路费已给出,且已知每个城市在第k(1<=k<=c)个月举办演唱会的所得利润,求最终的最大利润。
分析:第i个月在第j个城市举办演唱会,最终可得最大利润,由此可得状态转移方程:dp[i][j] = max(dp[i][j], dp[i - 1][k] - d[k][j] + a[j].v[i])。
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<string> 5 #include<algorithm> 6 #include<cstdlib> 7 #include<cmath> 8 using namespace std; 9 const int MAXN = 100 + 10; 10 struct 11 { 12 int v[55]; 13 }a[MAXN]; 14 int d[MAXN][MAXN]; 15 int dp[MAXN][MAXN]; 16 int main() 17 { 18 int n; 19 scanf("%d", &n); 20 while(n--) 21 { 22 memset(d, 0, sizeof d); 23 memset(dp, 0, sizeof dp); 24 int s, c; 25 scanf("%d%d", &s, &c); 26 for(int i = 1; i <= s; ++i) 27 for(int j = 1; j <= c; ++j) 28 scanf("%d", &a[i].v[j]); 29 for(int i = 1; i <= s; ++i) 30 for(int j = 1; j <= s; ++j) 31 scanf("%d", &d[i][j]); 32 for(int i = 1; i <= s; ++i) 33 dp[1][i] = a[i].v[1]; 34 for(int i = 2; i <= c; ++i) 35 for(int j = 1; j <= s; ++j) 36 for(int k = 1; k <= s; ++k) 37 dp[i][j] = max(dp[i][j], dp[i - 1][k] - d[k][j] + a[j].v[i]); 38 int ans = 0; 39 for(int i = 1; i <= s; ++i) 40 ans = max(ans, dp[c][i]); 41 printf("%d\n", ans); 42 } 43 return 0; 44 }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 加边的无向图--并查集 2020-04-10
- 结题报告 2020-02-07
- 洛谷P4431 2019-04-25
- 1001 A+B Format (20 分) 2018-12-09
- Wash!!(HDU_6000) 2018-10-03
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash