原来的代码(0pts)
#include<bits/stdc++.h>
using namespace std;
typedef long long llong;
int f,v;
int a[103][103];
llong dp[103][103];
int pre[103][103];
void print(int n,int p){
if(n==0)
return;
print(n-1,pre[n][p]);
printf("%d ",p);
}
int main(){
scanf("%d%d",&f,&v);
for(int i=1;i<=f;i++){
for(int j=1;j<=v;j++){
scanf("%d",&a[i][j]);
}
}
for(int i=1;i<=f;i++){
for(int j=1;j<=v;j++){
dp[i][j]=a[i][j];
llong maxn=LLONG_MIN;/////////////
int p=i-1;
for(int q=1;q<j;q++){
if(dp[p][q]>maxn){
maxn=dp[p][q];
pre[i][j]=q;
}
}
if(i!=1)
dp[i][j]+=maxn;
}
}
llong ans=LLONG_MIN;
int pos;
for(int i=f;i<=v;i++){
if(dp[f][i]>ans){
ans=dp[f][i];
pos=i;
}
}
printf("%lld\n",ans);
print(f,pos);
return 0;
}
修改后的代码(100pts)
#include<bits/stdc++.h>
using namespace std;
typedef long long llong;
int f,v;
int a[103][103];
llong dp[103][103];
int pre[103][103];
void print(int n,int p){
if(n==0)
return;
print(n-1,pre[n][p]);
printf("%d ",p);
}
int main(){
scanf("%d%d",&f,&v);
for(int i=1;i<=f;i++){
for(int j=1;j<=v;j++){
scanf("%d",&a[i][j]);
}
}
for(int i=1;i<=f;i++){
for(int j=1;j<=v;j++){
dp[i][j]=a[i][j];
llong maxn=INT_MIN;//////////
int p=i-1;
for(int q=1;q<j;q++){
if(dp[p][q]>maxn){
maxn=dp[p][q];
pre[i][j]=q;
}
}
if(i!=1)
dp[i][j]+=maxn;
}
}
llong ans=LLONG_MIN;
int pos;
for(int i=f;i<=v;i++){
if(dp[f][i]>ans){
ans=dp[f][i];
pos=i;
}
}
printf("%lld\n",ans);
print(f,pos);
return 0;
}
为什么把这个 LLONG_MIN 改成 INT_MIN 就对了?
这个是有什么地方溢出了吗?