hdu 5074
来源:互联网 发布:软件开发环境 编辑:程序博客网 时间:2024/04/25 14:18
思路: 很容易想到dp 我们只需要维护 以第i个数以 j 结尾的最大值就好了,结果就可以直接转移了 相当于每次两个for循环枚举前一个和后一个,我是分四种情况:
当前是否为-1 ,前一个是否为-1
#include<bits/stdc++.h>using namespace std;int a[1000];int b[200][200];int dp[200][200];int main(){ int T; scanf("%d",&T); while(T--) { int n,m; scanf("%d%d",&n,&m); for(int i =1; i<=m; i++) for(int j =1; j<=m; j++) scanf("%d",&b[i][j]); for(int i = 1; i<=n; i++) { scanf("%d",&a[i]); } memset(dp,0,sizeof(dp)); for(int i= 2; i<=n; i++) { if(a[i]==-1) { if(a[i-1]==-1) { for(int j = 1; j<=m; j++) { for(int k = 1; k<=m; k++) dp[i][j] = max(dp[i][j],dp[i-1][k]+b[k][j]); } } else { for(int j = 1; j<=m; j++) dp[i][j] = max(dp[i][j],dp[i-1][a[i-1]]+b[a[i-1]][j]); } } else { if(a[i-1]==-1) { for(int k = 1; k<=m; k++) dp[i][a[i]] = max(dp[i-1][k]+b[k][a[i]],dp[i][a[i]]); } else { dp[i][a[i]] = max(dp[i][a[i]],dp[i-1][a[i-1]]+b[a[i-1]][a[i]]) ; } } } int ans = 0; for(int i = 1; i<=m; i++) ans = max(ans, dp[n][i]); cout<<ans<<endl; } return 0;}
0 0
- hdu 5074
- Hdu 5074
- hdu 5074
- hdu 5074 Hatsune Miku
- HDU 5074 Hatsune Miku
- HDu 5074 Hatsune Miku
- HDU 5074 Hatsune Miku
- hdu 5074 dp
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- 大话设计模式(八)抽象工厂模式进化
- servlet学习总结(二)—图片下载和读取属性文件
- UIApplicationLaunchOptionsRemoteNotificationKey
- 用rem来做响应式开发
- 知识点二:文件的输入和输出
- hdu 5074
- Java之正则表达式
- C 自定义输入函数
- 基于spark的大数据提取校验框架
- Binary Tree Zigzag Level Order Traversal——Difficulty:Medium
- 总结10
- 知识点三:错误与异常
- BZOJ4444: [Scoi2015]国旗计划 解题报告
- PHP面试常用算法