传送门:点击打开链接
刚开始的两个代码过了给出的测试,但是一直wa,很绝望,但到现在都不知道为什么错
思路:从第一行开始将i行j列房间的奖券数加入到i - 1行的j列和i - 1行的j - 1列,取最大值存放到need[i][j],用ans取得本行最大的奖券数,顺序循环之后输出ans
先放错误代码
这个的思路是从下往上遍历,错误原因至今不明
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
int dp[100][100];
int need[100][100];
int n;
int main()
{
while(cin>>n)
{
memset(dp, 0, sizeof(dp));
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= i; j++)
{
cin>>need[i][j];
}
}
for(int i = n - 1; i >= 0; i--)
{
for(int j = 0; j <= i; j++)
{
dp[i][j] = max(dp[i + 1][j] + need[i + 1][j],
dp[i + 1][j + 1] + need[i + 1][j + 1]);
}
}
cout<<dp[0][0]<<endl;
}
return 0;
}
下面是AC代码
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
int need[105][105];
int n;
int main()
{
int ans;
while(cin>>n)
{
ans = 0;
memset(need, 0, sizeof(need));
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= i; j++)
{
cin>>need[i][j];
}
}
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= i; j++)
{
need[i][j] += max(need[i - 1][j], need[i - 1][j - 1]);
ans = max(ans, need[i][j]);
}
}
cout<<ans<<endl;
}
return 0;
}