hdu 5074 Hatsune Miku 简单dp
2016-09-29 14:22
399 查看
题意:
给出m*m的分值表和一个序列(其中有些位置待填),求总分值的最大值。总分值=序列中相邻元素的分值之和。解法:
dp[i][x]表示考虑了前i个序列且最后一个为x的最优值。代码:
#include<cstdio> #include<string> #include<cstring> #include<iostream> #include<cmath> #include<algorithm> #include<vector> using namespace std; #define all(x) (x).begin(), (x).end() #define for0(a, n) for (int (a) = 0; (a) < (n); (a)++) #define for1(a, n) for (int (a) = 1; (a) <= (n); (a)++) #define mes(a,x,s) memset(a,x,(s)*sizeof a[0]) #define mem(a,x) memset(a,x,sizeof a) #define ysk(x) (1<<(x)) typedef long long ll; typedef pair<int, int> pii; const int INF =0x3f3f3f3f; const int maxn= 100; int n,m; int sc[maxn+5][maxn+5],a[maxn+10]; int dp[maxn+5][maxn+5]; void solve() { mes(dp,-1,n+1); for1(j,m) if(a[1]==-1||a[1]==j) dp[1][j]=0; int ans=0; for(int i=2;i<=n;i++) { for1(cur,m) if(a[i]==cur|| a[i]==-1 ) { for1(k,m) if(~dp[i-1][k]) { dp[i][cur]=max(dp[i][cur],dp[i-1][k]+sc[k][cur]); } if(i==n) ans=max(ans,dp[i][cur]); } } cout<<ans<<endl; } int main() { std::ios::sync_with_stdio(false); int T;cin>>T; while(T--) { cin>>n>>m; for1(i,m) for1(j,m) cin>>sc[i][j]; for1(i,n) cin>>a[i]; solve(); } return 0; }
相关文章推荐
- hdu - 5074 Hatsune Miku (简单dp)
- HDU 5074 Hatsune Miku(简单二维dp)
- [ACM] HDU 5074 Hatsune Miku (简单DP)
- hdu 5074(简单dp)
- HDU 5074 Hatsune Miku(14鞍山区域赛 E)DP
- HDU 5074 Hatsune Miku (基础DP)2014鞍山现场赛E
- hdu 5074 Hatsune Miku(dp)
- HDU 5074 Hatsune Miku [dp] ——2014鞍山现场赛E题
- hdu 5074 Hatsune Miku DP题目
- HDU 5074 Hatsune Miku(DP)
- HDU 5074 Hatsune Miku DP
- HDU 5074 Hatsune Miku(DP)
- HDU 5074 Hatsune Miku 暴力dp
- HDU 5074 Hatsune Miku(dp)
- HDU 5074 Hatsune Miku(暴力+DP)
- hdu 5074 怎么才算简单dp
- 鞍山现场赛 hdu 5074- Hatsune Miku(DP)
- HDU 5074 Hatsune Miku 2014 Asia AnShan Regional Contest dp(水
- HDU 5074 Hatsune Miku [dp] ——2014鞍山现场赛E题
- HDU 5074 Hatsune Miku(DP)