[DP]JZOJ 3046 游戏
分析
对于$(k1-s1)*(k2-s2)$这个柿子,不难发现$k1-s1=\Sigma k-1$
所以事先给所有值-1,柿子变成$k1*k2=\Sigma k1_i\times\Sigma k2_i$
DP的柿子就是$f[i][j]=min(f[i+1][j],f[i+1][j+1],f[i][j+1])+a[i]*b[j]$
#include <iostream> #include <cstdio> #include <memory.h> using namespace std; const int N=2e3+10; int l1,l2; int a[N],b[N],f[N][N]; int main() { scanf("%d%d",&l1,&l2); for (int i=1;i<=l1;i++) scanf("%d",&a[i]),a[i]--; for (int i=1;i<=l2;i++) scanf("%d",&b[i]),b[i]--; memset(f,0x7f,sizeof f); f[l1+1][l2+1]=0; for (int i=l1;i;i--) for (int j=l2;j;j--) f[i][j]=min(f[i+1][j],min(f[i+1][j+1],f[i][j+1]))+a[i]*b[j]; printf("%d",f[1][1]); }
在日渐沉没的世界里,我发现了你。