首页 > 代码库 > [HDU 5074] Hatsune Miku (动态规划)
[HDU 5074] Hatsune Miku (动态规划)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5074
题目大意是给你m个note,n个数,得分是v[a[i]][a[i+1]]的总和,如果说a[i]是负数的话代表可以放人一个note,否则就只能放他给的note号。
问:最大的得分是多少?
我先写了记忆化搜索函数
dp(i,j)代表到第i个位置,放标号为j的note
那么
如果说a[i+1]<0,那么dp(i,j) = max( dp(i,j) , dp(i+1,k)+v[j][k] );
否则dp(i,j) = dp(i+1,a[i+1]) + v[j][a[i+1]];
然后改成递推呗~
1 #include <cstdio> 2 #include <cmath> 3 #include <algorithm> 4 #include <cstring> 5 using namespace std; 6 7 int T,n,m; 8 int v[55][55]; 9 int dp[111][55];10 int a[111];11 12 int main(){13 scanf("%d",&T);14 while(T--){15 memset(v,0,sizeof(v));16 memset(dp,0,sizeof(dp));17 memset(a,0,sizeof(a));18 scanf("%d%d",&n,&m);19 for(int i=1;i<=m;i++){20 for(int j=1;j<=m;j++){21 scanf("%d",&v[i][j]);22 }23 }24 for(int i=1;i<=n;i++){25 scanf("%d",&a[i]);26 }27 for(int i=n-1;i>=0;i--){28 for(int j=0;j<=m;j++){29 if( a[i+1]<0 ){30 for(int k=1;k<=m;k++){31 dp[i][j] = max(dp[i][j],dp[i+1][k]+v[j][k]);32 }33 } else {34 dp[i][j] = v[j][a[i+1]]+dp[i+1][a[i+1]];35 }36 }37 }38 printf("%d\n",dp[0][0]);39 }40 }
[HDU 5074] Hatsune Miku (动态规划)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。