nyoj 笨蛋的難題()二 題解
阿新 • • 發佈:2019-02-08
/*
這是我開始的做法,兩層迴圈,
其實存在思路不夠好,存在大量冗餘,導致時間超了
#include<iostream> using namespace std; #include<cstdio> #include<cstring> #include<cstdlib> #define N 125 int n; int sum[N]; int f[N],a[N],d[N],r[N]; int main() { while (~scanf("%d",&n)) { int i,j,t,k; for (i=1;i<=n;++i) { scanf("%d",&a[i]); sum[i]=sum[i-1]+a[i]; } f[n]=a[n]; d[n]=n; r[n]=0; for (i=n-1;i>0;--i) { for (j=i;j<=n;++j) if (f[i]<a[j]+r[j+1]) { f[i]=a[j]+r[j+1]; d[i]=j; } k=i; t=0; while (k<=n) { t+=sum[d[k]-1]-sum[k-1]; k=d[k]+1; } r[i]=sum[n]-sum[i-1]-t-f[i]; } printf("%d %d %d \n",f[1],r[1],t); memset(sum,0,sizeof(sum)); memset(f,0,sizeof(f)); memset(d,0,sizeof(d)); memset(r,0,sizeof(r)); } return 0; }
*/
/*
正解應該是dp,類似於最大子串和, 實現時通過降維可以不用陣列
兩個陣列f[i],g[i],分別表示笨蛋和傻子從第i小時開始的最大工資
f[i]=max(g[i-1]+a[i],f[i-1])
如果f[i]= g[i-1]+a[i],則g[i]=f[i-1]
顯然可以降維,不用陣列,用兩個變數即可。
*/
#include<iostream> using namespace std; #include<cstdio> #include<cstring> #include<cstdlib> #define N 125 int n,sum; int a[N]; int main() { while (~scanf("%d",&n)) { int i,j,t,k; sum=0; for (i=1;i<=n;++i) { scanf("%d",&a[i]); sum=sum+a[i]; } int max1=0,max2=0,tmp; for (i=n;i>0;--i) if (a[i]+max2>=max1) { tmp=max1; max1=a[i]+max2; max2=tmp; } printf("%d %d %d\n",max1,max2,sum-max1-max2); } return 0; }