一道C语言动态规划题

一道C语言动态规划题,第1张

#include<iostream>

#include<cstring>

using namespace std

int a[101][101],f[101][101],n,T

int maxi(int a,int b,int c)

{

if(a<b)

a=b

if(a<c)

a=c

return a

}

int main()

{

cin>>T

for(TT--)

{

cin>>n

memset(a,0,sizeof(a))

memset(f,0,sizeof(f))

for(int i=1i<=ni++)

for(int j=1j<=ncin>>a[i][j],j++)

//f[i][j]=max{f[i+1][j-1],f[i+1][j],f[i+1][j+1]}+a[i][j],1<=i,j<=n.

for(int i=ni>=1i--)

for(int j=1j<=nj++)

f[i][j]=maxi(f[i+1][j-1],f[i+1][j],f[i+1][j+1])+a[i][j]

int maxans=-32768

for(int i=1i<=ni++)

if(f[1][i]>maxans)

maxans=f[1][i]

cout<孝斗简<maxans<<endl

}

return 0

}

这是一个我写的程序,LZ试试销岩这个可以不

你的程序唯一一处不对劲的地方,就是规划过程中的else语句。把它改成巧裤if(j!=0&&j!=m-1)试试?

在mincost函数里面,应该加上:

if(m == n)

return 0

//下面的code是我刚写的递归石子合并,可以参考

//如果有疑问,欢迎交流

//石子合并,递归version测试通过。

#include<stdio.h>哪念乎

#define N 4

int get_sum(int *tar, int n,int head, int tail){

int cur_res = 0

int i

for(i = head i<=tail i++)

cur_res+=tar[i]

return cur_res

}

int combine_tar(int states_lib[][4], int *tar, int n, int head, int tail){

if(head == tail){

return 0

}else{

int j, cur_min = 9999999, cur_value = 0

if(states_lib[head][tail]!=0){

return states_lib[head][tail]

}

for(j = head j < tail j++){

//动态规划的状态转移方程

cur_value = combine_tar(states_lib, tar, n, head, j) + combine_tar(states_lib, tar, n, j+1, tail)

if(cur_min > cur_value){

cur_min = cur_value

}

}

states_lib[head][tail] = cur_min + get_sum(tar, n, head, tail)

return states_lib[head][tail]

}

}

int main(){

int states_lib[N][N] = {0}

int tar[N] = {4,4,5,9}

int res = combine_tar(states_lib, tar,4, 0, 3)

return 0

}

昨天就关注了这个问题,并试着写高指了石子合并,李悉但当时没有写对,刚写成功了,递归和非递归的版本,欢迎交流。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/8209803.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存