2014ACM/ICPC亚洲区北京站
Dire Wolf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
import java.io.*; public class Main { final static long inf=0x7FFFFFFFFFFFFFFFL; static long min(long a,long b){ return Math.min(a, b); } public static void main(String[] args) throws IOException{ StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); PrintWriter out=new PrintWriter(new OutputStreamWriter(System.out)); in.nextToken(); int T=(int)in.nval,cas=0; int[] a,b; long[][] f; while(T-->0){ in.nextToken(); int n=(int)in.nval; a=new int[n+2]; b=new int[n+2]; f=new long[n+2][n+2]; for(int i=1;i<=n;i++){ in.nextToken(); a[i]=(int)in.nval; } for(int i=1;i<=n;i++){ in.nextToken(); b[i]=(int)in.nval; } f[1][1]=a[1]+b[2]; f[n][n]=a[n]+b[n-1]; for(int i=2;i<n;i++) f[i][i]=a[i]+b[i-1]+b[i+1]; for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) f[i][j]=inf; for(int j=0;j<=n;j++) for(int i=1;i+j<n+1;i++) for(int k=i;k<=i+j;k++){ f[i][i+j]=min(f[i][i+j],f[i][k-1]+f[k+1][i+j]+a[k]+b[i-1]+b[i+j+1]); }
out.println("Case #"+(++cas)+": "+f[1][n]); out.flush(); } out.close(); } }
|
贪心真的是要贪婪死了。。。
已消除区段。。。其实对后续操作没有影响,符合无后效性。