#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int n, m;
const int maxn = 104;
int fv[maxn][maxn];
int dp[maxn][maxn];
void solve()
{int i, k , j, q;for(i=1;i<n;i++){for(k=i;k<m;k++){ //第i束花插入第k个瓶子里面dp[i][k]=-10000;for(j=i-1;j<k;j++){ //取其中的最大值q=dp[i-1][j]+fv[i][k];if(q>dp[i][k])dp[i][k]=q;}}}
}
int main()
{cin >> n >> m;for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {cin >> fv[i][j];}}for (int i = 0; i < m; ++i) {dp[0][i] = fv[0][i];}solve();int ans = dp[n-1][n-1];for(int i = n - 1; i < m; i++)if(ans < dp[n-1][i])ans = dp[n-1][i]; //为其中的最大值printf("%dn",ans);return 0;
}
第二种解法的状态函数为f[i][j]表示第i束花插入前j个瓶子里面。则状态转移函数为f[i][j]=max(f[i-1][j-1]+a[i][j],f[i][j-1]) 因为有两种插法,一:第i束花插入第j个瓶子里面,则为f[i][j]=f[i-1][j-1]+a[i][j].二:第i束花不插入第j个瓶子里面,则f[i][j]=f[i][j-1]。两者当中取极大 解法二代码: #include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int n, m;
const int maxn = 104;
int fv[maxn][maxn];
int dp[maxn][maxn];
void solve()
{for (int i = 1; i < n; ++i) {for (int j = i + 1; j < m; ++j) {dp[i][j] += max(dp[i][j - 1], dp[i - 1][j - 1] + fv[i][j]);}}
}
int main()
{cin >> n >> m;for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {cin >> fv[i][j];}}dp[0][0] = fv[0][0];for (int i = 1; i < m; ++i) {dp[0][i] = max(dp[0][i - 1], fv[0][i]);}for(int i=1; i<n; i++)dp[i][i]=dp[i-1][i-1] + fv[i][i];solve();cout << dp[n - 1][m - 1] << endl; //为其中的最大值return 0;
}
本文发布于:2024-02-02 09:17:25,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170683664442818.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |