作业代码

来源:互联网 发布:2011网络春晚大张伟 编辑:程序博客网 时间:2024/05/22 08:17

作业代码

//3.3  path 路径#include <cstdio>#include <iostream>#include <cstring>#include <queue>#include <cmath>using namespace std;struct node{    int v, a, b, c[2000];}p[50][50];int mmin(int a,int b){    if (a > b) return b;    else return a;}int fac(int x){  return x*x;  }int main(){    int T, o = 0;    cin >> T;    while (T--)    {        int n, m;        cin >> n >> m;        memset(p, 0, sizeof(p));        for (int i0 = 1;i0 <= n;i0++)            for (int j = 1;j <= m;j++)                cin >> p[i0][j].v;        p[1][1].a = fac(p[1][1].v);        p[1][1].b = p[1][1].v;         p[1][1].c[p[1][1].v] = fac(p[1][1].v);         for (int j = 2;j <= m;j++)        {            p[1][j].a = p[1][j - 1].a + fac(p[1][j].v);            p[1][j].b = p[1][j - 1].b + p[1][j].v;            p[1][j].c[p[1][j].b] = p[1][j].a;        }        for (int i1 = 2;i1 <= n;i1++)        {            p[i1][1].a = p[i1 - 1][1].a + fac(p[i1][1].v);            p[i1][1].b = p[i1 - 1][1].b + p[i1][1].v;            p[i1][1].c[p[i1][1].b] = p[i1][1].a;        }        for (int i = 2;i <= n;i++)            for (int j = 2;j <= m;j++)                for (int k = 0;k < 2000;k++)                 {                    if (p[i][j - 1].c[k])                    {                        int f = k + p[i][j].v;                        if (p[i][j].c[f])                                                   p[i][j].c[f] = mmin(  p[i][j].c[f], p[i][j - 1].c[k] + fac(p[i][j].v)  );                        else                            p[i][j].c[f] = p[i][j - 1].c[k] + fac(p[i][j].v);                    }                    if (p[i - 1][j].c[k])                    {                        int f = k + p[i][j].v;                        if (p[i][j].c[f])                            p[i][j].c[f] = mmin(p[i][j].c[f], p[i - 1][j].c[k] + fac(p[i][j].v));                        else                            p[i][j].c[f] = p[i - 1][j].c[k] + fac(p[i][j].v);                    }                }        int ans = 1000000000;        for (int i2 = 0;i2 < 2000;i2++)            if (p[n][m].c[i2])                ans = mmin(ans, (n + m - 1)*p[n][m].c[i2] - fac(i2));        printf("Case #%d: %d\n", ++o, ans);    }    return 0;}
//4.4 szjl 数字接力#include<cstdio>   #include<cstring>   #include<iostream>   using namespace std;   char a[1005][32];   char p[1005][32];     int n = 0;   //自己写一个字符串比较函数   int strcmp_vv(char s[], char t[])   {       char r[200];       char r1[200];       strcpy(r, s);       strcat(r, t);       strcpy(r1, t);       strcat(r1, s);       int i = strcmp(r, r1);       return i;   }   void outv()   {         for (int i = 0;i < n;i++)             printf("%s",a[i]);                 printf("\n");   }   //将有二个有序数列a[first...mid]和a[mid...last]合并。     void mergearray(char a[][32], int first, int mid, int last,char temp[][32])   {         int i = first, j = mid + 1;       int m = mid, n = last;       int k = 0;       while (i <= m && j <= n)       {         if (strcmp_vv(a[i], a[j])==1)                 strcpy(temp[k++], a[i++]);             else                 strcpy(temp[k++], a[j++]);       }       while (i <= m)           strcpy(temp[k++] , a[i++]);       while (j <= n)           strcpy(temp[k++] , a[j++]);       for (i = 0; i < k; i++)           strcpy(a[first + i] , temp[i]);     cout<<" first "<<first<<" mid "<<mid<<" last "<<last<<endl;    outv();         cout<<endl;}   void mergesort(char a[][32], int first, int last,char temp[][32])   {       if (first < last)       {            int mid = (first + last) / 2;           mergesort(a, first, mid,temp);            mergesort(a, mid + 1, last,temp);            mergearray(a, first, mid, last,temp);         }    }   bool MergeSort(char a[][32], int n)   {       if (p == NULL) return false;       mergesort(a, 0, n - 1,p);       return true;   }   int main()   {       cin >> n;       for (int i = 0;i < n;i++)    cin >> a[i];        MergeSort(a,n);       outv();       return 0;   } 
原创粉丝点击